l_code=l_code&0x0f; if(l_code!=0xef) {
h_code=0xfe; /*逐行输出0*/ while(h_code!=0xff) {
H_PORT=h_code; l_code=L_PORT; l_code=l_code&0x0f; if(l_code==0x0f) {
h_code=h_code<<1; h_code=h_code|0x01; } }
h_code^=0xff; /*计算键值,方法是先把行值与0xff相异或,使对应的0的那一位变为1*/
for(i=0;i<=x;i++) /* 然后把行值与2的指数幂作比较,若想等,则把其对应的幂值赋给行值*/
{ /*最后,把得到的行值放在高四位,与列值相或可得到键值*/ if(h_code==Exp(2,x)) {
h_code=x; break; } }
h_code=h_code<<4; key_code=h_code|l_code;
21
switch(key_code) {
case 0x0e: case 0x1e: ……
case 0x67: case 0x77:
goto k14 goto k15 goto k0; goto k1
default:break; } } }
ulint Exp(uint m,uint x) /*指数函数*/ {uint i; ulint temp=1; for(i=0;i<=x;i++) {
temp*=m; }
return temp; }
3.编写出8位LED共阴极显示器的动态显示的C51程序。
#include
#define uchar unsigned char #define COM8255 XBYTE[0xbfff] #define PA8255 XBYTE[0xbcff]
22
#define PB8255 XBYTE[0xbdff] #define PC8255 XBYTE[0xbeff]
uchar idata dis_buf[8]={1,2,3,4,5,6,7,8}; /*显示缓冲区*/
uchar code table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71, 0x40,0x00}; void dl_ms(uchar d); void display(void)
{ uchar esgcode,bitcode,i; bitcode=0xfe; for(i=0;i<=7;i++) { esgcode=dis_buf[i]; PB8255=table[esgcode]; PA8255=bitcode; dl_ms(1);
bitcode=bitcode<<1; bitcode=bitcode|0x01; } }
void main(void) { COM8255=0x80; while(1) { display(); } }
23
4.与8051单片机接口的8255的4个端口地址分别为:0DFFCH、0DFFDH、0DFFEH、0DFFFH。对8255编程:口A输出数据0AAH,口B输入10个数据到片内RAM区,由PC4位产生一个负脉冲,低电平宽度为10μs。
#include
#define uchar unsigned char #define COM8255 XBYTE[0xdfff] #define PA8255 XBYTE[0xdffc] #define PB8255 XBYTE[0xdffd] #define PC8255 XBYTE[0xdffe] data uchar Buffer[10] _at_0x30;
void main(void) { uchar index; int j;
COM8255=0x82; PA8255=0XAA;
for(index=0;index<10;index++) { Buffer[index]=PB8255; }
PC8255=0xef; for(j=0;j<1;j++); }
5.设某个生产过程有6道工序,每道工序的时间分别为10s、8s、12s、15s、9s和6s。设延迟程序DYLA的延时为1s。用单片机通过8255的口A来进行控制。口A中的每一位可以控制某一位的起停,试编写有关程序。
24