C语言编写程序用于16LED显示屏键盘输入汉字LED屏输出

C语言编写程序用于16LED显示屏键盘输入汉字LED屏输出,第1张

#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

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12517062.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存