📄 9.c
字号:
/*=======da5667按键显示=======*/
//8255cs接Y0,控制液晶的377的E接Y1, AD677的CS接Y7 A0(A0,A1)接P2.0;A1(A2,A3)接P2.1
#include <stdio.h>
#include<intrins.h>
#include<reg51.h>
#include<absacc.h>
//#define uchar unsigned char
//#define uint unsigned int
#define D8255 XBYTE[0x1C00] //8255状态/数据口地址
#define D8255C XBYTE[0x1800] //8255 PC口地址
#define Dlcd XBYTE[0x2FFF]//显示的地址
#define DDAH XBYTE[0xFDFF]// 667的高4位地址
#define DDAL XBYTE[0xFEFF]// 667的低8位地址
//#define DDA XBYTE[0xEFFF] //启动转换
unsigned int y;
sbit rs = P1^0; //1=数据; 0=指令;
sbit rw = P1^1; //1=读; 0=写;
sbit e = P1^2; //1=使能?
sbit clk=P1^7; //DA控制端
//sbit da=P2^4;
unsigned int tab[]={0x0EE,0x0ED,0x0EB,0x0E7,0x0DE,0x0DD,0x0DB,0x0D7,0x0BE,0x0BD,
0x0BB,0x0B7,0x7E,0x7D,0x7B,0x77 }; /*键码表*/
unsigned char tab1[]={"1234567890ABCDEF"}; /*段码表*/
unsigned char tab2[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};
unsigned char lt[]={0x7f,0x0bf,0x0df,0x0ef}; /*行扫描码*/
//*************************延时函数*********************************
void delay(unsigned char DelayTime) //延时1ms*DelayTime
{unsigned int j=0;
for(;DelayTime>0;DelayTime--)
{ for(j=0;j<125;j++)
{;}
}
}
/*---------------写指令------------------------*/
write_comm(unsigned char c)
{
delay(2);
//e1=0;
rs=0;
rw=0;
XBYTE[0x2FFF]=c;
e=1;
_nop_();
e=0;
}
/*------------------初始化-----------------*/
void init_lcd (void)
{
write_comm (0x30); //基本指令集
write_comm (0x01); //清屏,地址指针指向00H
write_comm (0x06); //光标的移动方向
write_comm (0x0c); //开显示,关游标
}
/*------------------显示-----------------*/
void display(unsigned int i)
{
delay(2);
rs=1;
rw=0;
XBYTE[0x2FFF]=tab1[i];
e=1;
_nop_();
e=0;
return;
}
/*------------------DA转换-----------------*/
void DA(unsigned int m)
{
DDAL=0xff&m;
DDAH=(0x0f00&m)>>8;
}
/*------------------功能键-----------------*/
void able(unsigned int c)
{
if(c==0x7B)
DA(y);
}
/*------------------主函数-----------------*/
main()
{
unsigned int i,j,a,b;
XBYTE[0x1C00]=0x81;
init_lcd ();
j=0;
for(;;)
{
for(XBYTE[0x1800]=0x0f; XBYTE[0x1800]==0x0f;); /*行线输出低电平,并判断是否有键按下*/
i=0; /*行计数器清零*/
b=lt[i]; /*取行扫描码*/
do
{
XBYTE[0x1800]=b; /*送行扫描码到P1口*/
a=XBYTE[0x1800]; /*读入列值*/
a=a&0x0f; /*保留低4位*/
if(a==0x0f) /*如果该列没有键按下,则送出下一行扫描码*/
{
i++;
if(i==4)i=0;
b=lt[i];
}
}
while(a==0x0f); /*循环到该列有键按下为止*/
b=b&0x0f0; /*取行扫描码的高4位*/
b=b|a; /*合并成为按键的扫描码*/
i=0; /*计数器清零*/
for(; b!=tab[i]; i++); /*在键值表中查找相应的键值*/
delay(200); /*延时,去抖动*/
if(j<3)
{j++;
y=(y<<4)+tab2[i];
display(i); /*显示段码*/
for(XBYTE[0x1800]=0x0f; XBYTE[0x1800]!=0x0f;); /*判断按键是否结束*/
delay(300); } /*延时*/
able(tab[i]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -