📄 test1.c
字号:
case 'y': zf_disp8(R_ye,R_lie,smally);R_lie=R_lie+8; break;
case 'z': zf_disp8(R_ye,R_lie,smallz);R_lie=R_lie+8; break;
}
//翻页
if(R_lie>127)
{
R_lie = 64+16;
R_ye=R_ye+1;
if(R_ye>7)
{
R_ye = 0;
R_lie = 80;
Clr_Scr();
zf_disp8(0,0,biga);
zf_disp8(0,8,maohao);
zf_disp8(0,64,bigb);
zf_disp8(0,72,maohao);
}
}
// zf_disp8(R_ye,R_lie,kongge); R_lie = R_lie+8; //一组数据传输完之后要显示一个空格
}
void Keyboard_out(void) interrupt 2 //键盘中断
{
if ((IntNum > 0) && (IntNum < 9))
{
KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
if (Key_Data) //数据线的电平
KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位 KevV的值将在此处发生改变
}
IntNum++; // 中断次数计数
while (!Key_CLK); // 等待PS/2CLK拉高
if (IntNum > 10)
{
IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
BF = 1; //标识有字符输入完成
EA = 0; // 关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声明为再入函数)
}
}
void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
{
unsigned char TempCyc;
if (!Key_UP) //当键盘松开时 Key_UP初始是0
{
switch (ScanCode)
{
case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
Key_UP = 1; break;
case 0x12 : // 左 SHIFT
Shift = 1; break;
case 0x59 : // 右 SHIFT
Shift = 1; break;
default:
if(!Shift) //如果SHIFT没按下
{
for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++)
; //查表显示
if (UnShifted[TempCyc][0] == ScanCode)
Display_Right(UnShifted[TempCyc][1]);
//DisplayOneChar(DisNum, 1, UnShifted[TempCyc][1]); //改,用128*64显示
buf[DisNum] = UnShifted[TempCyc][1];
DisNum++; //显示用指针
}
else //按下SHIFT
{
for(TempCyc = 0; (Shifted[TempCyc][1]!=ScanCode)&&(TempCyc<59); TempCyc++)
; //查表显示
if (Shifted[TempCyc][0] == ScanCode)
Display_Right(Shifted[TempCyc][1]); // 显示
buf[DisNum] = Shifted[TempCyc][1];
DisNum++; //显示用指针
}
break;
}
}
else
{
Key_UP = 0;
switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
{
case 0x12 : // 左 SHIFT
Shift = 0;
break;
case 0x59 : // 右 SHIFT
Shift = 0;
break;
}
}
BF = 0; //标识字符处理完了
}
/*** 键盘处理程序 ***/
void DealKeyboard()
{
if (BF)
Decode(KeyV);
else
EA = 1; //开中断
if(buf[DisNum-1]==' ') //DisNum 多加了一次,所以要减一
{
flag = 1;
zf_disp8(R_ye,R_lie,kongge); R_lie = R_lie+8; //一组数据输入完之后要显示一个空格
}
}
/* 主程序 */
void main()
{
uchar i = 0,L_ye=0,L_lie=0+16;
uchar tmp = 0xff;
P27 = 1; // 发光管不亮
init_lcd(); //液晶初始化
Clr_Scr();
//开机画面
Disp_Img(Bmp);
delay(1000);
Clr_Scr();
zf_disp8(0,0,biga);
zf_disp8(0,8,maohao);
zf_disp8(0,64,bigb);
zf_disp8(0,72,maohao);
init_serial(); // 串口初始化
EA = 1; // 打开所有中断
ES = 1;
SM2 = 1; // 只接收地址帧
IT1 = 0; // 外部中断低电平触发
EX1 = 1;
/* 进入设备应答 */
while(1)
{
ES = 1; //开串口中断
EX1 = 1; //开外部中断 用于PS2
/* if() // 发送数据 要先发送地址 ADDR_B 还要发送数据长度,数据,校检字节
{
SBUF = ; //发送键盘输入的数据
}*/
DealKeyboard();
/****** 发送数据 ******/
if(flag == 1)
/* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧 */
{
ES = 0; //关闭串口中断
flag = 0;
*(buf+DisNum) = 0; // 缓冲区最后一个字节为0表示数据结束
DisNum = 0;
delay(10); // 发送时置模式时最好延时
/* 发送从机地址 */
TI = 0;
TB8 = 1; // 发送地址帧 good
SBUF = ADDR_A; // 发送本机地址
while(!TI);
TI = 0;
senddata(buf); // 发送数据
//清空 buf[]
for(i = 0;i<10;i++)
{
buf[i] = 0;
}
ES = 1;
}
// SM2 = 1; // 只接收地址帧
// 地址位中断接收了
/************ 接收数据 ************/
if(addr == ADDR_B) //
{
addr = addr - 5;
SM2 = 0; //
ES = 0; // 关串口中断
/* 数据接收 */
tmp = 0xff;
while(tmp==0xff) // 如果校验失败则重新接收数据
{
/* 校验失败返回0xff,检测到地址帧则返回0xee,接收成功返回0 */
tmp = recvdata(buf);
}
if(tmp==0x00) // 校验正确,表示接收成功
{
/* 红灯状态变化,表示接收数据成功 */
P27 = ~P27;
for(i = 0;i<strlen(buf);i++) //左半屏显示 接收到的数据
{
switch(buf[i])
{
case '0': zf_disp8(L_ye,L_lie,sz_0);L_lie=L_lie+8; break;
case '1': zf_disp8(L_ye,L_lie,sz_1);L_lie=L_lie+8; break;
case '2': zf_disp8(L_ye,L_lie,sz_2);L_lie=L_lie+8; break;
case '3': zf_disp8(L_ye,L_lie,sz_3);L_lie=L_lie+8; break;
case '4': zf_disp8(L_ye,L_lie,sz_4);L_lie=L_lie+8; break;
case '5': zf_disp8(L_ye,L_lie,sz_5);L_lie=L_lie+8; break;
case '6': zf_disp8(L_ye,L_lie,sz_6);L_lie=L_lie+8; break;
case '7': zf_disp8(L_ye,L_lie,sz_7);L_lie=L_lie+8; break;
case '8': zf_disp8(L_ye,L_lie,sz_8);L_lie=L_lie+8; break;
case '9': zf_disp8(L_ye,L_lie,sz_9);L_lie=L_lie+8; break;
case 'a': zf_disp8(L_ye,L_lie,smalla);L_lie=L_lie+8; break;
case 'b': zf_disp8(L_ye,L_lie,smallb);L_lie=L_lie+8; break;
case 'c': zf_disp8(L_ye,L_lie,smallc);L_lie=L_lie+8; break;
case 'd': zf_disp8(L_ye,L_lie,smalld);L_lie=L_lie+8; break;
case 'e': zf_disp8(L_ye,L_lie,smalle);L_lie=L_lie+8; break;
case 'f': zf_disp8(L_ye,L_lie,smallf);L_lie=L_lie+8; break;
case 'g': zf_disp8(L_ye,L_lie,smallg);L_lie=L_lie+8; break;
case 'h': zf_disp8(L_ye,L_lie,smallh);L_lie=L_lie+8; break;
case 'i': zf_disp8(L_ye,L_lie,smalli);L_lie=L_lie+8; break;
case 'j': zf_disp8(L_ye,L_lie,smallj);L_lie=L_lie+8; break;
case 'k': zf_disp8(L_ye,L_lie,smallk);L_lie=L_lie+8; break;
case 'l': zf_disp8(L_ye,L_lie,smalll);L_lie=L_lie+8; break;
case 'm': zf_disp8(L_ye,L_lie,smallm);L_lie=L_lie+8; break;
case 'n': zf_disp8(L_ye,L_lie,smalln);L_lie=L_lie+8; break;
case 'o': zf_disp8(L_ye,L_lie,smallo);L_lie=L_lie+8 ; break;
case 'p': zf_disp8(L_ye,L_lie,smallp);L_lie=L_lie+8 ; break;
case 'q': zf_disp8(L_ye,L_lie,smallq);L_lie=L_lie+8 ; break;
case 'r': zf_disp8(L_ye,L_lie,smallr);L_lie=L_lie+8 ; break;
case 's': zf_disp8(L_ye,L_lie,smalls);L_lie=L_lie+8 ; break;
case 't': zf_disp8(L_ye,L_lie,smallt);L_lie=L_lie+8 ; break;
case 'u': zf_disp8(L_ye,L_lie,smallu);L_lie=L_lie+8 ; break;
case 'v': zf_disp8(L_ye,L_lie,smallv);L_lie=L_lie+8 ; break;
case 'w': zf_disp8(L_ye,L_lie,smallw);L_lie=L_lie+8 ; break;
case 'x': zf_disp8(L_ye,L_lie,smallx);L_lie=L_lie+8 ; break;
case 'y': zf_disp8(L_ye,L_lie,smally);L_lie=L_lie+8 ; break;
case 'z': zf_disp8(L_ye,L_lie,smallz);L_lie=L_lie+8 ; break;
}
if(L_lie>63)
{
L_lie = 0+16;
L_ye = L_ye +1 ;
if(L_ye>7)
{
L_ye = 0;
L_lie = 16;
Clr_Scr();
zf_disp8(0,0,biga);
zf_disp8(0,8,maohao);
zf_disp8(0,64,bigb);
zf_disp8(0,72,maohao);
}
}
}
zf_disp8(L_ye,L_lie,kongge); L_lie = L_lie+8; //一组数据传输完之后要显示一个空格
}
SM2 = 1; // 只接收地址帧
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -