#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*下面是引脚连接关春派哪系*/
sbit AD_EOC =P2^4 /*转换完成指示*/
sbit AD_IOCLK =P2^3 /*时 钟*/
sbit AD_DATIN =P2^2 /*数据入*/
sbit AD_DATOUT=P2^1 /*数据出*/
sbit AD_CS =P2^0 /*片 选*/
uint ad_result /*存各模拟通道的数据*/
sbit E=P2^7
sbit rs=P2^6
sbit rw=P2^5
sbit S1=P3^0
sbit S2=P3^1
sbit S3=P3^2
sbit S4=P3^3
sbit S5=P3^4
sbit S6=P3^5
sbit S7=P3^6
sbit S8=P3^7
sbit S9=P1^5
sbit S10=P1^6
sbit S11=P1^7
sbit S12=P1^0
uchar code zengzhen[]={"wuhanligongdaxue"}
uchar code zengzhen1[]={"Cha : mV "}
uint zengzhen2[8]
uint i,j
uchar sum
void delay(uint z)
{
uint x,y
for(x=zx>0x--)
for(y=110y>0y--)
}
void write_com(uchar com)
{
rs=0
rw=0
P0=com
E=0
delay(1)
E=1
delay(1)
E=0
}
void write_date(uchar date)
{
rs=1
rw=0
P0=date
E=0
delay(1)
E=1
delay(1)
E=0
}
void init()
{
E=0
write_com(0x38)
write_com(0x0c)
羡握 write_com(0x06)
write_com(0x01)
}
/*启动A/D转换,并读取上次转换结果*/
uint read2543(CHN)
{
uchar i,temp
uint read_ad_data = 0
CHN=CHN<<4
AD_IOCLK=0
AD_CS=1
AD_CS=0
temp=CHN
for(i=0i<12i++)
{
read_ad_data=read_ad_data<<1
if((temp&0x80)!=0){AD_DATIN=1}
else{AD_DATIN=0}
if(AD_DATOUT){read_ad_data=read_ad_data+1}
AD_IOCLK =1
_nop_()_nop_()_nop_()_nop_()
AD_IOCLK =0
_nop_()_nop_()_nop_()_nop_()
temp=temp<扒码<1
}
AD_CS=1
read_ad_data=read_ad_data&0x0fff
return(read_ad_data)
}
void display(uint k,uchar add)
{
uchar a,b,c,d
float j=k*4.444/4.095
uint i=j/1
a=i/1000
b=i%1000/100
c=i%100/10
d=i%10
write_com(add)
write_date(a+0x30)
write_date(b+0x30)
write_date(c+0x30)
write_date(d+0x30)
delay(300)
}
/************显示程序*************/
/*主 程序*/
void scan()
{
if(S1==0)
{
delay(5)
if(S1==0)
{
while(!S1)
sum=1
}
}
if(S2==0)
{
delay(5)
if(S2==0)
{
while(!S2)
sum=2
}
}
if(S3==0)
{
delay(5)
if(S3==0)
{
while(!S3)
sum=3
}
}
if(S4==0)
{
delay(5)
if(S4==0)
{
while(!S4)
sum=4
}
}
if(S5==0)
{
delay(5)
if(S5==0)
{
while(!S5)
sum=5
}
}
if(S6==0)
{
delay(5)
if(S6==0)
{
while(!S6)
sum=6
}
}
if(S7==0)
{
delay(5)
if(S7==0)
{
while(!S7)
sum=7
}
}
if(S8==0)
{
delay(5)
if(S8==0)
{
while(!S8)
sum=8
}
}
if(S9==0)
{
delay(5)
if(S9==0)
{
while(!S9)
sum=9
}
}
if(S10==0)
{
delay(5)
if(S10==0)
{
while(!S10)
sum=10
}
}
if(S11==0)
{
delay(5)
if(S11==0)
{
while(!S11)
sum=11
}
}
if(S12==0)
{
delay(5)
if(S12==0)
{
while(!S12)
sum=12
}
}
}
void fw()
{
write_com(0x80+0x40+2)
for(j=0j<12j++)
{
write_date(zengzhen1[j])
delay(5)
}
}
void main(void)
{
uchar h
uint s=0
init()
delay(23)
write_com(0x80)
for(j=0j<16j++)
{
write_date(zengzhen[j])
delay(5)
}
write_com(0x80+0x40+2)
for(j=0j<12j++)
{
write_date(zengzhen1[j])
delay(5)
}
while(1)
{
if(sum==12)
{
scan()
if(sum!=12)
{
init()
delay(23)
write_com(0x80)
for(j=0j<16j++)
{
write_date(zengzhen[j])
delay(5)
}
write_com(0x80+0x40+2)
for(j=0j<12j++)
{
write_date(zengzhen1[j])
delay(5)
}
}
}
if(sum==11)
{
scan()
if(sum!=11)
{
fw()
}
}
scan()
if(sum==1)
{
for(h=0h<15h++)
{
ad_result=read2543(0)
while(!AD_EOC)
s+=ad_result
}
s=s/15
write_com(0x80+0x40+5)
write_date(0+0x30)
display(s,0x80+0x40+7)
s=0
}
if(sum==2)
{
for(h=0h<15h++)
{
ad_result=read2543(1)
while(!AD_EOC)
s+=ad_result
}
s=s/15
write_com(0x80+0x40+5)
write_date(1+0x30)
display(s,0x80+0x40+7)
s=0
}
if(sum==3)
{
for(h=0h<15h++)
{
ad_result=read2543(2)
while(!AD_EOC)
s+=ad_result
}
s=s/15
write_com(0x80+0x40+5)
write_date(2+0x30)
display(s,0x80+0x40+7)
s=0
}
if(sum==4)
{
for(h=0h<15h++)
{
ad_result=read2543(3)
while(!AD_EOC)
s+=ad_result
}
s=s/15
write_com(0x80+0x40+5)
write_date(3+0x30)
display(s,0x80+0x40+7)
s=0
}
if(sum==5)
{
for(h=0h<15h++)
{
ad_result=read2543(4)
while(!AD_EOC)
s+=ad_result
}
s=s/15
write_com(0x80+0x40+5)
write_date(4+0x30)
display(s,0x80+0x40+7)
s=0
}
if(sum==6)
{
for(h=0h<15h++)
{
ad_result=read2543(5)
while(!AD_EOC)
s+=ad_result
}
s=s/15
write_com(0x80+0x40+5)
write_date(5+0x30)
display(s,0x80+0x40+7)
s=0
}
if(sum==7)
{
for(h=0h<15h++)
{
ad_result=read2543(6)
while(!AD_EOC)
s+=ad_result
}
s=s/15
write_com(0x80+0x40+5)
write_date(6+0x30)
display(s,0x80+0x40+7)
s=0
}
if(sum==8)
{
for(h=0h<15h++)
{
ad_result=read2543(7)
while(!AD_EOC)
s+=ad_result
}
s=s/15
write_com(0x80+0x40+5)
write_date(7+0x30)
display(s,0x80+0x40+7)
s=0
}
if(sum==9)
{
for(h=0h<15h++)
{
ad_result=read2543(8)
while(!AD_EOC)
s+=ad_result
}
s=s/15
write_com(0x80+0x40+5)
write_date(8+0x30)
display(s,0x80+0x40+7)
s=0
}
if(sum==10)
{
for(h=0h<15h++)
{
ad_result=read2543(9)
while(!AD_EOC)
s+=ad_result
}
s=s/15
write_com(0x80+0x40+5)
write_date(9+0x30)
display(s,0x80+0x40+7)
s=0
}
if(sum==11)
{
for(h=0h<15h++)
{
ad_result=read2543(10)
while(!AD_EOC)
s+=ad_result
}
s=s/15
write_com(0x80+0x40+5)
write_date(1+0x30)
write_date(0+0x30)
write_date(':')
display(s,0x80+0x40+8)
write_date('m')
write_date('V')
s=0
}
if(sum==12)
{
/*delay(100)
for(h=0h<8h++)
{
ad_result=read2543(h)
while(!AD_EOC)
ad_result=read2543(h)
zengzhen2[h]=ad_result
}
*/
zengzhen2[0]=read2543(0)
while(!AD_EOC)
display(zengzhen2[0],0x80)
zengzhen2[1]=read2543(1)
while(!AD_EOC)
display(zengzhen2[1],0x84)
zengzhen2[2]=read2543(2)
while(!AD_EOC)
display(zengzhen2[2],0x88)
zengzhen2[3]=read2543(3)
while(!AD_EOC)
display(zengzhen2[3],0x8c)
zengzhen2[4]=read2543(4)
while(!AD_EOC)
display(zengzhen2[4],0x80+0x40)
zengzhen2[5]=read2543(5)
while(!AD_EOC)
display(zengzhen2[5],0x80+0x40+4)
zengzhen2[6]=read2543(6)
while(!AD_EOC)
display(zengzhen2[6],0x80+0x40+8)
zengzhen2[7]=read2543(7)
while(!AD_EOC)
display(zengzhen2[7],0x80+0x40+12)
}
}
}
望采纳 谢谢//这是51hei单片机开发板让纯冲附带的一个程序,矩阵键盘接p3口,其中p3.0-p3.4为行,P3.5->p3.7为列//每按一下键数字便可显示在1602液晶上面,并且蜂鸣器会发出响声.
//全部源代码下载: http://www.51hei.com/f/jz1602.rar
#include<reg52.h>裤庆
#include <Intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6
sbit wela=P2^7
sbit rs=P2^2
sbit lcden=P2^0
sbit rw=P2^1
sbit BEEP=P2^3
uchar num,temp,date,i
uchar code table_1[]=" shu ru tiao ma "
uchar code table_2[]=" Pro_8888 "
uchar code dis_tab[17]=
{
0x30, //0在1602中的十六进制码
0x31, //1在1602中的十六进制码
0x32, //2在1602中的十六进制码
0x33, //3在1602中的十六进制码
0x34, //4在1602中的十六进制码
0x35, //5在1602中的十六进制码
0x36, //6在1602中的十六进制码
0x37, //7在1602中的十六进制码
0x38, //8在1602中的十六进制码
0x39, //9在1602中的十六进制码
0x41, //A在1602中的十六进制码
0x42, //B在1602中的十六进制码
0x43, //C在1602中的十六进制码
0x44, //D在1602中的十六进制码
0x2A, //*在1602中的十六进制码
0x23, //#在1602中的十六进制码
0x20, // 在1602中的十六进制码
}
void delay(uint z)
{
uint x,y
for(x=zx>0x--)
for(y=110y>0y--)
}
void beep()
{
uchar i
for (i=0i<50i++)
{
delay(4)
BEEP=0 //BEEP取反
}
BEEP=1 //关闭蜂鸣器
delay(100) //延时
}
void lcd_wait_busy() //1602忙检测函数
{
P0=0xff //数据口全部置1,为读状态做准备
rs=0 //选择指令寄存器
rw=1 //选择读
lcden=1 //使能线电平变化
while((P0&0x80)==0x80)//读忙状态,不忙时退出
lcden=0 //恢复使能线电平
}
// 1602写命令函数
void lcd_write_com(unsigned char combuf)
{
rs=0 //选择指令寄存器
rw=0 //选择写
P0=combuf //把命令字送入P2
lcden=1 //使能线电平变化,命令送入1602的8位数据口
_nop_()
lcden=0 //恢复使能线坦歼电平
}
// 1602写命令函数(带忙检测)
void lcd_write_com_busy(unsigned char combuf)
{
lcd_wait_busy() //调用忙检测函数
lcd_write_com(combuf) //调用写命令函数
}
// 1602写数据函数(带忙检测)
void lcd_write_data(unsigned char databuf)
{
lcd_wait_busy() //调用忙检测函数
rs=1 //选择数据寄存器
rw=0 //选择写
P0=databuf //把数据字送入P2
lcden=1 //使能线电平变化,命令送入1602的8位数据口
_nop_()
lcden=0 //恢复使能线电平
}
// 1602显示地址写函数
void lcd_write_address(unsigned char x,unsigned char y)
{
y&=0x01 //行地址限制在0-1
if(y==0x00)
lcd_write_com_busy(x|0x80) //第一行的列地址写入
else
lcd_write_com_busy((x+0x40)|0x80) //第二行的列地址写入
}
// 指定地址写入函数
void lcd_write_char(unsigned char x,unsigned char y,unsigned char buf)
{
lcd_write_address(x,y)//写入地址
lcd_write_data(buf) //写入显示数据
}
// 液晶初始化指令
void lcd_init()
{
uchar num
dula=0
wela=0
lcden=0
lcd_write_com_busy(0x38)//设置16*2显示,5*7点阵,8位数据接口
lcd_write_com_busy(0x0d)//关显示 显示光标 光标闪烁
lcd_write_com_busy(0x06)//当读或写一个字符后地址指针加一,且光标加一,写一个字符,整屏显示移动
lcd_write_com_busy(0x01)//显示清屏:1,数据指针清零 2,所有显示清零
lcd_write_com_busy(0x80)//80h+地址码(0-27h,40h-67h) 设置数据地址指针
for(num=0num<16num++)
{
lcd_write_data(table_1[num])
delay(5)
}
lcd_write_com_busy(0x80+0x40)
}
void key_wdat(uchar i) //按键写数据
{
// dula=0
// wela=0
// lcden=0
//液晶初始化指令
// write_com(0x38)//设置16*2显示,5*7点阵,8位数据接口
// write_com(0x0d)//关显示 显示光标 光标闪烁
// write_com(0x06)//当读或写一个字符后地址指针加一,且光标加一,写一个字符,整屏显示移动
// write_com(0x01)//显示清屏:1,数据指针清零 2,所有显示清零
// write_com(0x80+0x40)//80h+地址码(0-27h,40h-67h) 设置数据地址指针
lcd_wait_busy()
lcd_write_data(i)
delay(100)
}
// 删除液晶第1或2行全部数据
void clear(uchar t)
{
if(t==1)
{
lcd_write_com_busy(0x80)
}
if(t==2)
{
lcd_write_com_busy(0x80+0x40)
}
for(i=0i<15i++)
{
lcd_write_data(dis_tab[16])
}
lcd_write_com_busy(0x80+0x40)
}
// 产品显示函数 待写 如何从键盘输入中提取出三位的产品号码???????????????????
/*
void display_product()
{
}
*/
// 4*4矩阵键盘检测
void keyscan()
{
lcden=1//???
//
P3=0xfe
temp=P3
temp=temp&0xf0
while(temp!=0xf0)
{
delay(5)
temp=P3
temp=temp&0xf0
while(temp!=0xf0)
{
temp=P3
switch(temp)
{
case 0xee:key_wdat(dis_tab[7])beep() // 7
break
case 0xde:key_wdat(dis_tab[8])beep() // 8
break
case 0xbe:key_wdat(dis_tab[9])beep() // 9
break
case 0x7e:key_wdat(dis_tab[17])beep() //
break
}
while(temp!=0xf0)
{
temp=P3
temp=temp&0xf0
}
}
}
//
P3=0xfd
temp=P3
temp=temp&0xf0
while(temp!=0xf0)
{
delay(5)
temp=P3
temp=temp&0xf0
while(temp!=0xf0)
{
temp=P3
switch(temp)
{
case 0xed:key_wdat(dis_tab[4])beep() // 4
break
case 0xdd:key_wdat(dis_tab[5])beep() // 5
break
case 0xbd:key_wdat(dis_tab[6])beep() // 6
break
case 0x7d:key_wdat(dis_tab[17])beep() //
break
}
while(temp!=0xf0)
{
temp=P3
temp=temp&0xf0
}
}
}
//
P3=0xfb
temp=P3
temp=temp&0xf0
while(temp!=0xf0)
{
delay(5)
temp=P3
temp=temp&0xf0
while(temp!=0xf0)
{
temp=P3
switch(temp)
{
case 0xeb:key_wdat(dis_tab[1])beep() // 1
break
case 0xdb:key_wdat(dis_tab[2])beep() // 2
break
case 0xbb:key_wdat(dis_tab[3])beep() // 3
break
case 0x7b:key_wdat(dis_tab[17])beep() //
break
}
while(temp!=0xf0)
{
temp=P3
temp=temp&0xf0
}
}
}
//
P3=0xf7
temp=P3
temp=temp&0xf0
while(temp!=0xf0)
{
delay(5)
temp=P3
temp=temp&0xf0
while(temp!=0xf0)
{
temp=P3
switch(temp)
{
case 0xe7:key_wdat(dis_tab[0])beep() // 0
break
case 0xd7:key_wdat(dis_tab[17])beep() //
break
case 0xb7:clear(2)beep() // 删除液晶第二行
break
case 0x77:beep() // enter
break
}
while(temp!=0xf0)
{
temp=P3
temp=temp&0xf0
}
}
}
}
//
void main()
{
lcd_init()
while(1)
{
keyscan()
}
while(1)
}
#define LCD1602_FLAG
#define LCD1602_PORT P0
#include<reg51.h>
#include<stddef.h>
#define uchar unsigned char
sbit lcd1602_rs=P2^0
sbit lcd1602_e=P2^2
sbit lcd1602_rw=P2^1
sbit lcd1602_busy=P0^7
uchar str[]="This is Key Test"
uchar keyval,keystr[16]
void delay(uchar a)
{
uchar i
while(a--)for(i=0i<120i++)
}
/*
************************************
* 函数名称:lcd1602_CheckBusy()
* 函数功能:状态查询
************************************
*/
void lcd1602_CheckBusy()
{
do
{
lcd1602_busy=1
lcd1602_rs=0
lcd1602_rw=1
lcd1602_e=0
lcd1602_e=1
}
while(lcd1602_busy)
}
/*
***************************************
* 函数名称: lcd1602_WriteCmd()
* 函数功能:写命令
* 入口参数:命令字
* 出口参数:无
***************************************
*/
void lcd1602_WriteCmd(const uchar cmd)
{
lcd1602_CheckBusy()
lcd1602_rs=0
lcd1602_rw=0
lcd1602_e=1
LCD1602_PORT=cmd
lcd1602_e=0
}
/*
*******************************************
* 函数名称:lcd1602_WriteData()
* 函数功能:写数据
* 入口参数:c--待写数据
* 出口参数:无
*********************************************
*/
void lcd1602_WriteData(const uchar c)
{
lcd1602_CheckBusy()
lcd1602_rs=1
lcd1602_rw=0
lcd1602_e=1
LCD1602_PORT=c
lcd1602_e=0
}
/*
***********************************************
* 函数名称:lcd1602_Init()
* 函数侍历功能:初始化LCD
* 入口参数:无
* 出口参数:无
***********************************************
*/
void lcd1602_Init()
{
lcd1602_WriteCmd(0x38) //显示模式为8位2行5*7点阵
lcd1602_WriteCmd(0x0c)//display enable,flag enable,flash enable,
lcd1602_WriteCmd(0x06)//flag move to right,screen don't move
lcd1602_WriteCmd(0x01)//clear screen
}
/*
************************************************
* 函数名称:lcd1602_Display()
* 函数功能: 字符显示
* 入口参数:ptr--字符或字符串指针
* 出口参数:无
* 说 明:用户可通过以下方式来调用:
* 1)lcd1602_Display("Hello,world!")
* 2) INT8U 存储老掘搜类型 txt[]="要显示散猛的字符串"
* 或者 INT8U 存储类型 txt[]={'t','x','t',..,'\0'}
* INT8U *ptr
* ptr=&txt
* lcd1602_Display(ptr)
* 或 lcd1602_Display(txt)
* 或 lcd1602_Display(&txt)
************************************************
*/
void lcd1602_Display(const uchar *ptr,uchar line)
{
uchar data i=0
uchar *data q
q=ptr
switch(line)
{
case 0:
lcd1602_WriteCmd(0x80)
while(q!=NULL &&(*q!='\0') &&i<16)
{
lcd1602_WriteData(*q)
q++
i++
}
break
case 1:
lcd1602_WriteCmd(0xc0)
while(q!=NULL &&(*q!='\0') &&i<16)
{
lcd1602_WriteData(*q)
q++
i++
}
break
}
}
uchar kbscan(void)
{
unsigned char sccode,recode
P3=0x0f //发0扫描,列线输入
if ((P3 &0x0f) != 0x0f) //有键按下
{
delay(20) //延时去抖动
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef //逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0
while((P3&0x0f)!=0x0f)//等待键抬起
return((~sccode)+(~recode))
}
else
sccode=(sccode<<1)|0x01
}
}
}
return 0 //无键按下,返回0
}
uchar getkey(void)
{
uchar key
key=kbscan()
if(key==0){keyval=0xffreturn(0)}
switch(key)
{
case 0x11:keyval=7break
case 0x12:keyval=4break
case 0x14:keyval=1break
case 0x18:keyval=10break
case 0x21:keyval=8break
case 0x22:keyval=5break
case 0x24:keyval=2break
case 0x28:keyval=0break
case 0x41:keyval=9break
case 0x42:keyval=6break
case 0x44:keyval=3break
case 0x48:keyval=11break
case 0x81:keyval=12break
case 0x82:keyval=13break
case 0x84:keyval=14break
case 0x88:keyval=15break
default:keyval=0xffbreak
}
if(keyval!=0xff)return(1)
else return(0)
}
main()
{
uchar num
lcd1602_Init()
lcd1602_Display(str,0)
while(1)
{
if(getkey())
{
keystr[num]=keyval+0x30
lcd1602_Display(keystr,1)
num++
num%=16
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)