📄 showkeynumber.c
字号:
#include "iom128v.h"
#include "macros.h"
#define CMD_READ 0x15
#define ada (*(volatile unsigned char*) 0x1118)//外部存储器地址映射,ada是读写地址
#define adb (*(volatile unsigned char*) 0x111a)//adb是横坐标
#define adc (*(volatile unsigned char*) 0x1119)//adc是纵坐标
//液晶读写操作函数
void write(unsigned char x ,unsigned char y, unsigned char buffer1, unsigned char buffer2, unsigned char buffer3);//液晶输入程序
void read(unsigned char x,unsigned char y,char *b1,char *b2,char *b3);//读取一个字节位的数据
void clrall(char color);//清屏操作
//液晶汉字输出
void hz_write(char x,char y,char *hz,char color);//将输入的黑白格式转换为给lcd可以识别的彩色字模
void lettershow(char x,char y,char *hz,char color);//按照列位置显示任意大小颜色的字符
void showchar(char x,char y,char a,char letter,char color);//在任意位置显示a所表示的值
//void showchars(char x,char y,char *a,char letter,char color);//在任意位置显示字符串a所表示的值
/******液晶的基本输入输出,一次写入或读出横向八个点*******/
char a;
char keydown;
char weizi=10;
char tempa=0XFF;
char tempb;
//按键延时
void short_delay(void);
void long_delay(void);
void delay_1ms(void);
unsigned char key_number=0Xff;
//******T1长延时******
void long_delay(void)
{
unsigned char i;
for (i=0;i<0x30;i++)
;
}
//*********T2,T3,T6,T7短延时*******
void short_delay(void)
{
unsigned char i;
for(i=0;i<8;i++)
;
}
//*******按键延时*****
void delay_1ms(void)
{
unsigned int i,j;
for(j=1;j<20;j++)
{
for(i=1;i<200;i++)
;
}
}
//************发送键盘指令*******
void send_byte(unsigned char out_byte)
{
unsigned char i;
DDRD=0xFd;
PORTD&=0xEF; //使CS=0
long_delay(); //T1 50us
for(i=0;i<8;i++)
{
if (out_byte&0x80)
{
PORTD|=0x08; //使DAT=1
}
else
{
PORTD&=0xF7; //使DAT=0
}
PORTD|=0x04; //使CLK=1
short_delay();//T2 8us
PORTD&=0xFB; //使CLK=0
short_delay();//T3 8us
out_byte=out_byte*2;
}
PORTD&=0xF7;
}
unsigned char receive_byte(void)
{
unsigned char i, in_byte;
DDRD=0xF5; //dat=1输入状态 HGFHJGH
PORTD|=0X08;
long_delay(); //T5 25us
for (i=0;i<8;i++)
{
PORTD|=0x04; //使CLK=1
short_delay();//T6 8us
in_byte=in_byte*2;
if ((PIND&0x08)==0x08) //判断DAT是否为1 JHJGH
{
in_byte=in_byte|0x01;
PORTB=0x01;
}
short_delay(); //T7 8us
PORTD&=0xFB; //使CLK=0
short_delay(); //T7 8us
}
PORTD&=0xF7; //使DAT=0
return (in_byte);
}
unsigned char read7279(unsigned char command)
{
send_byte(command);
return(receive_byte());
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
CLI();
EIMSK=0X00;
delay_1ms();
key_number=read7279(CMD_READ);
if(tempa!=key_number)
{
if(key_number==0x09)
{
a=1;
}
else if(key_number==0x08)
{
a=2;
}
else if(key_number==0x0B)
{
a=3;
}
else if(key_number==0x01)
{
a=4;
}
else if(key_number==0x00)
{
a=5;
}
else if(key_number==0x03)
{
a=6;
}
else if(key_number==0x19)
{
a=7;
}
else if(key_number==0x18)
{
a=8;
}
else if(key_number==0x1B)
{
a=9;
}
else if(key_number==0x10)
{
a=0;
}
tempa=key_number;
keydown=keydown%4;
if(tempb%2==0)
{
if(keydown==0)//只按下一次案件,显示数字
showchar(weizi,130,a,0,7);
else
{
a=(a-1)*3+keydown+58;
showchar(weizi,130,a,1,7);
}
showchar(weizi,140,keydown,0,7);
weizi++;
keydown=0;
}
tempb++;
}
keydown++;
EIMSK=0X02;
SEI();
}
void WDT_off(void)
{
WDTCR=(1<<WDCE)|(1<<WDE);//write logical one to WDCE and WDE
WDTCR=(0<<WDE);// turn off WDT
}
void main(void)
{
MCUCR=0X80;//选择外部存储器
DDRA=0XFF;
PORTA=0X14;//将a口的第3、5口输出
DDRC=0X00;
PORTC=0XFF;//前面的几步都是在选择和初始化液晶
clrall(0x00);//用黑色清屏
clrall(0x01);//用黑色清屏
EICRA=0X08;
WDT_off();
SEI();
DDRD=0xFd;
PORTD=0x12;
EIMSK=0X02;
//for(;;);
}
void write (unsigned char x ,unsigned char y, unsigned char buffer1, unsigned char buffer2, unsigned char buffer3)
{
DDRA=0xff;//a口为输出
adb=x;
adc=y;
ada=buffer1;
ada=buffer2;
ada=buffer3;
}
void read(unsigned char x,unsigned char y,char *b1,char *b2,char *b3)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -