
#include <reg52h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
#define DD P0
sbit Rs=P0^0;
sbit Rw=P0^1;
sbit E=P0^2;
uchar key_led;
unsigned char code disp_code[]=;
unsigned char code key_code[]={
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 };//注意这里你自己看下你电路是怎么连得,对应改一下表单里的值
//
/
/
/ 延时子程序
/
/
/
//
void delay(int ms)
{
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void delay_1ms(unsigned char i) //最小延时1ms
{ unsigned char j;
while(i--)
for(j=0;j<125; j++);
}
void delay_10ns(unsigned char i) //最小延时10ns
{
unsigned char j;
while(i--)
for(j=0;j<10; j++);
}
void write_com(unsigned char com,bit p) //写指令
{if(p)
delay_10ns(5);
E=0;
Rs=0;
Rw=0;
DD=com;
delay_10ns(50); //>40ns
E=1;
delay_1ms(2); //>150ns
E=0;
delay_10ns(4); //>25+10ns
}
void write_date(unsigned char DATA) //写数据
{
delay_10ns(50);
E=0;
Rs=1;
Rw=0;
DD=DATA;
delay_10ns(50);
E=1;
delay_10ns(50);
E=0;
delay_10ns(4);
}
void addr_x_y(unsigned char x,bit y) //写坐标,定位置
{
unsigned char temp=0x80;
if(y)
{
temp|=0x40;
}
temp|=x;
write_com(temp,0);
}
void desplay_char(unsigned char x,bit y,unsigned char p)
//在指定位置显示一个字符。
{
addr_x_y(x,y);
write_date(p);
}
void lcd_init(void)
{
delay_1ms(15);
write_com(0x38,0);
delay_1ms(5);
write_com(0x38,0);
delay_1ms(5);
write_com(0x38,0);
delay_1ms(5);
write_com(0x38,1);
write_com(0x08,1);
write_com(0x01,1);
write_com(0x06,1);
write_com(0x0c,1);
}
/
键盘扫描子函数
/
uchar keyscan()
{
uchar scan1,scan2,keycode,j;
P1=0xf0;
scan1=P1;
if((scan1&0xf0)!=0xf0) //判键是否按下
{
delay(30); //延时30ms
scan1=P1;
if((scan1&0xf0)!=0xf0) //二次判键是否按下
{
P1=0x0f;
scan2=P1;
keycode=scan1|scan2; //组合成键编码
for(j=0;j<=15;j++)
{
if(keycode== key_code[j]) //查表得键值
{
delay(30);
key_led=j;
}
}
}
}
else return(16) ;
}
/
判键是否按下子函数
/
void keydown()
{
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
keyscan();
}
}
//
/
/
/ 主程序
/
/
/
//
void main(void)
{
lcd_init(); // 初始化LCD
key_led=16;
while(1)
{
keydown();
desplay_char(0,0,disp_code[key_led]);
}
}
第一次认真回答,不采纳没有小鸡鸡。。。。。。。。。。
#include <reg52H>
#include<intrinsh>
#define uint unsigned int
#define uchar unsigned char
//心形显示
//unsigned char code tabP0[]={0x30,0x48,0x44,0x22,0x44,0x48,0x30,0x00};
//unsigned char code tabP2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
//圆形显示
unsigned char code tabP0[]={0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00};
unsigned char code tabP2[]={0x7F,0xBF,0x0DF,0x0EF,0x0F7,0x0FB,0x0FD,0x0FE};
//菱形显示
//unsigned char code tabP0[]={0x00,0x08,0x14,0x22,0x41,0x22,0x14,0x08};
//unsigned char code tabP2[]={0x7F,0xBF,0x0DF,0x0EF,0x0F7,0x0FB,0x0FD,0x0FE};
//叉形显示
//unsigned char code tabP0[]={0x00,0x41,0x22,0x14,0x08,0x14,0x22,0x41};
//unsigned char code tabP2[]={0x7F,0xBF,0x0DF,0x0EF,0x0F7,0x0FB,0x0FD,0x0FE};
//中字显示
//unsigned char code tabP0[]={0x00,0x1e,0x12,0x12,0x7f,0x12,0x12,0x1e};
//unsigned char code tabP2[]={0x7F,0xBF,0x0DF,0x0EF,0x0F7,0x0FB,0x0FD,0x0FE};
/
名称 : Delay_1ms()
功能 : 延时子程序,延时时间为 1ms x
输入 : x (延时一毫秒的个数)
输出 : 无
/
void Delay_1ms(uchar i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/
名称 : Main()
功能 : 主函数
输入 : 无
输出 : 无
/
void main()
{
int i;
while(1)
{
for(i=0;i<8;i++)
{
P0=0;
P2=tabP2[i];
P0=tabP0[i];
Delay_1ms(2);
}
}
}
下列程序已经调好,按键显示电路可见:
//单片机:使用51系列兼容的即可;
//4×4矩阵键盘:接在P1口;
//两位数码显示器: P0口输出七段码,P2口输出位选码。
/========================================
//C语言程序如下。
/
文件名: KEY_LEDc
功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。
/
#include <reg51h>
#include <intrinsh>
#define uint unsigned int
#define uchar unsigned char
uchar code table[10] = ;
uchar sec, t_50ms;
/
名称 : Delay_1ms()
功能 : 延时子程序,延时时间为 1ms x
输入 : x (延时一毫秒的个数)
输出 : 无
/
void Delay_1ms(uint x)
{
uint i;
uchar j;
for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);
}
/
名称: Display(uchar k)
功能: 将参数分成十位、个位分别显示
输入: k (键盘数值)
输出: P0口输出七段码,P2口输出位选码
/
void Display(uchar k)
{
P2 = 0; //消隐
P0 = table[k / 10];
P2 = 0x02; Delay_1ms(5); //显示5ms十位
P2 = 0; //消隐
P0 = table[k % 10];
P2 = 0x01; Delay_1ms(5); //显示5ms个位
}
/
名称: Keyscan()
功能: P1外接4×4按键, 按照扫描法读出键值
输出: 按键值0~15/如无键按下, 返回16
/
uchar Keyscan(void)
{
uchar i, j, temp, Buffer[4] = ;
for(j = 0; j < 4; j++) { //循环四次
P1 = Buffer[j]; //在P1高四位分别输出一个低电平
temp = 0x01; //计划先判断P10位
for(i = 0; i < 4; i++) { //循环四次
if(!(P1 & temp)) //从P1低四位,截取1位
return (i + j 4); //返回取得的按键值
temp <<= 1; //判断的位,左移一位
} }
return 16; //判断结束,没有键按下,返回16
} //呵呵,实质性的语句不过8行,就是这么简练!
/
名称: GetKey()
功能: 读出按键、消抖、等待按键释放
输出: 按键值0~15/如无键按下, 返回16
/
uchar GetKey(void)
{
uchar Key_Temp1, Key_Temp2; //两次读出的键值
P1 = 0xff;
Key_Temp1 = Keyscan(); //先读入按键
if(Key_Temp1 == 16) return 16; //没有键按下,返回16
Display(sec); //用显示代替延时
Key_Temp2 = Keyscan(); //再读一次按键
if(Key_Temp1 != Key_Temp2) return 16; //不同,返回16
while(Keyscan() < 16) //等待按键释放
Display(sec); //等待期间显示
return Key_Temp1;
}
/
名称 : Main()
功能 : 主函数
/
void Main(void)
{
uchar Key_Value; //读出的键值
sec = 0;
TMOD = 0x01;
TH1 = (65536-50000)/256;
TL1 = (65536-50000)%256;
TR0 = 1;
ET0 = 1;
EA = 1;
while(1) {
Display(sec); //显示
if (GetKey() == 10) {
TR0 = 0;
while (TR0 == 0) {
Display(sec); //显示
Key_Value = GetKey();
if (Key_Value < 10) {
sec %= 10;
sec = sec 10 + Key_Value;
}
if (Key_Value == 10) TR0 = 1;
} } }
}
/
名称 : T0_INT()
功能 : T0中断函数
/
void T0_INT() interrupt 1
{
TH1 = (65536-50000)/256;
TL1 = (65536-50000)%256;
t_50ms++;
if(t_50ms >= 20) {
t_50ms = 0;
sec++;
sec %= 60;
}
}
//
写程序之前一定要先从系统的级别构建一下程序的结构。
你的程序中,有数码管扫描显示、按键扫描两部分。
在构建程序结构的时候,考虑到几个部分的特点,一般情况如下:
1、为了保证显示不闪,应在20ms内完成一次显示刷新,假设你用了10个数码管数字。
2、按键是随机的,需要检测,一般按键按下的时间不小于50ms,可以考虑在10ms检测一次按键。
程序可以定义一个1ms的定时器,设置几个变量对定时器进行计数。
每个1ms定时到时,自加对定时器的计数,并更新数码管显示,10ms更新完10个数码管。
每到10ms检测一次按键,记录状态,与上次状态进行比较,如果连续两次或三次检测到按键按下,设置按键动作的标记,并确定如何更改显示,改变显存。
如果数码管需要调整亮度,可以将1ms定时器改为100us,分给每个数码管的1ms内,改变其点亮的时间,就可以调出十种亮度。
用这种架构做这个程序,处理器负担很轻,对所有的外设的响应一样迅速。你会感到51单片机还是能干很多活的。比如你的程序增加一个RTC模块,可以每100ms刷新一下RTC时间到显存,就可以实现显示时间。
程序功能能否实现你自己验证,先把错误给你改了,已编译通过。#include<reg51h>#include<intrinsh>#define
dig
P2#define
uint
unsigned
int#define
uchar
unsigned
char
codeuchar
number[10]={0xc0,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};sbit
K1=P0^0;sbit
K2=P0^1;//10sbit
K3=P0^2;sbit
K4=P0^3;sbit
K5=P0^4;sbit
K6=P0^5;sbit
K7=P0^6;sbit
K8=P0^7;void
anjian();//这里没分号void
yanshi(uint
nms);void
main()//20{P0=0xff;//初始化anjian();//这里多void
少分号}/按键程序/
//30void
anjian(){uint
i;//这以后的错误是变量i没定义if(K1==0){yanshi(10);if(K1==0){dig=number[1];while((K1==0)&&(i<50)){//40yanshi(10);i++;}i=0;}}if(K2==0){yanshi(10);if(K2==0)//50{dig=number[2];while((K2==0)&&(i<50)){yanshi(10);i++;}i=0;}}//60if(K3==0){yanshi(10);if(K3==0){dig=number[3];while((K3==0)&&(i<50)){yanshi(10);i++;//70}i=0;}}if(K4==0){yanshi(10);if(K4==0){dig=number[4];//80while((K4==0)&&(i<50)){yanshi(10);i++;}i=0;}}if(K5==0){//90yanshi(10);if(K5==0){dig=number[5];while((K5==0)&&(i<50)){yanshi(10);i++;}i=0;//100}}if(K6==0){yanshi(10);if(K6==0){dig=number[6];while((K6==0)&&(i<50)){//110yanshi(10);i++;}i=0;}}if(K7==0){yanshi(10);if(K7==0)//130{dig=number[7];while((K7==0)&&(i<50)){yanshi(10);i++;}i=0;}}//140if(K8==0){yanshi(10);if(K8==0){dig=number[8];while((K8==0)&&(i<50)){yanshi(10);i++;//150}i=0;}}}/延时子程序/void
yanshi(uint
xms)//160{uint
a,b;for(a=xms;a>0;a--)for(b=110;b>0;b--);}
以上就是关于单片机键盘输入数字全部的内容,包括:单片机键盘输入数字、求 51单片机 4*4矩阵键盘 控制8*8点阵 显示 的语音 程序。、用汇编语言实现3*3键盘(1-9),当相应键按下时,LED上显示相应数值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)