為什么給串口送的都是0。
#include<reg51.h> #define uchar unsigned char #define uint unsigned int uchar a ,b; uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; sbit dula = P2^6; sbit wela = P2^7; void Key_Scan(); void xianshi(); void fa_jian(uchar Num); uchar KeyNo = 16; uchar Pre_KeyNo = 16; uchar Timer = 0 ,flag = 0; void delayms(uint ms) { uint i,j; for(i = ms;i > 0;i --) for(j = 110;j > 0;j --); } void init() { TMOD = 0x21; //開定時器T0工作方式1于T1工作方式2 TH0 = (65536 - 5000)/256; TL0 = (65536 - 5000)%256; //設置5ms初值 TR0 =1; //啟動定時器0 ET0 = 1; //開定時器中斷0 TH1 = 0xfd; TL1 = 0xfd; //設置波特率為9600bps TR1 = 1; //啟動定時器2 REN = 1; //允許串口接收 SM0 = 0; SM1 = 1; //設置串口工作方式1 EA = 1; //開總中斷 ES = 1; //開串口中斷 } void main() { init(); while(1) { if(flag == 1) { flag = 0; xianshi(); fa_jian(KeyNo); } } }
void Key_Scan() { uchar Tmp; P3 = 0x0f; delayms(1); Tmp = P3^0x0f; switch(Tmp) { case 1: KeyNo = 0; break; case 2: KeyNo = 1; break; case 4: KeyNo = 2; break; case 8: KeyNo = 3; break; default: KeyNo = 16; } P3 = 0xf0; delayms(1); Tmp = (P3 >> 4) ^ 0x0f; switch(Tmp) { case 1: KeyNo += 0; break; case 2: KeyNo += 4; break; case 4: KeyNo += 8; break; case 8: KeyNo += 12; } } void ser() interrupt 4 { if(RI == 1) { RI = 0; // a = SBUF; } }
void fa_jian(uchar Num) { ES = 0; SBUF = Num; while(!TI); TI = 0; ES = 1; }
void xianshi() { P3 = 0xf0; if(P3 != 0xf0) Key_Scan(); if( KeyNo < 16) { dula = 1; P0 = table[KeyNo]; dula = 0; P0 = 0xff;
wela = 1; P0 = 0xfe; wela = 0; delayms(5); } } void T0_Timer() interrupt 1 { TH0 = (65536 - 5000)/256; TL0 = (65536 - 5000)%256; if(++Timer == 20) { Timer = 0; flag = 1; } } |