#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P2^0
sbit LCD_RW = P2^1
sbit LCD_EN = P2^2
#define delayNOP()
uchar data RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 }
uchar temp,buf,m,count
bit playflag=0
uchar code cdis1[ ] =
uchar code cdis2[ ] =
/**********************************************************
延时子程序
**********************************************************/
void delay1(uint ms)
{
uchar k
while(ms--)
{
for(k = 0k <120k++)
}
}
/******************************************************************/
/**/
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据橘旦。 */
/**/
/******************************************************************/
bit lcd_busy()
{
bit result
LCD_RS = 0
LCD_RW = 1
LCD_EN = 1
delayNOP()
result = (bit)(P0&0x80)
LCD_EN = 0
return(result)
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉中伍哗冲,卖行D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy())
LCD_RS = 0
LCD_RW = 0
LCD_EN = 0
_nop_()
_nop_()
P0 = cmd
delayNOP()
LCD_EN = 1
delayNOP()
LCD_EN = 0
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy())
LCD_RS = 1
LCD_RW = 0
LCD_EN = 0
P0 = dat
delayNOP()
LCD_EN = 1
delayNOP()
LCD_EN = 0
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
delay1(15)
lcd_wcmd(0x01) //清除LCD的显示内容
lcd_wcmd(0x38) //16*2显示,5*7点阵,8位数据
delay1(5)
lcd_wcmd(0x38)
delay1(5)
lcd_wcmd(0x38)
delay1(5)
lcd_wcmd(0x0c) //开显示,显示光标,光标闪烁
delay1(5)
lcd_wcmd(0x01) //清除LCD的显示内容
delay1(5)
}
/*******************************************************************/
/* */
/* 设定显示位置 */
/* */
/*******************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80) //数据指针=80+地址变量
}
/*********************************************************
发送数据函数
*********************************************************/
void senddata(uchar dat)
{
SBUF =dat
while(!TI)
TI = 0
}
/*********************************************************
串行中断服务函数
*********************************************************/
void serial() interrupt 4
{
ES = 0 //关闭串行中断
RI = 0 //清除串行接受标志位
buf = SBUF //从串口缓冲区取得数据
playflag=1
switch(buf)
{
case 0x31: senddata('W')break //接受到1,发送字符'W'给计算机
case 0x32: senddata('I')break //接受到2,发送字符'I'给计算机
case 0x33: senddata('L')break //接受到3,发送字符'L'给计算机
case 0x34: senddata('L')break //接受到4,发送字符'L'给计算机
case 0x35: senddata('A')break //接受到5,发送字符'A'给计算机
case 0x36: senddata('R')break //接受到5,发送字符'R'给计算机
default:senddata(buf)break //接受到其它数据,将其发送给计算机
}
if(buf!=0x0D)
{
if(buf!=0x0A)
{
temp =buf
if(count<16)
{
RXDdata[count]=temp
count++
}
}
}
ES = 1 //允许串口中断
}
/*********************************************************
数据显示函数
*********************************************************/
void play()
{
if(playflag)
{
lcd_pos(0x40) //设置位置为第二行
for(m=0m<16m++)
lcd_wdat(cdis2[m]) //清LCD1602第二行
for(m=0m<16m++)
{
lcd_pos(0x40+m) //设置显示位置为第二行
lcd_wdat(RXDdata[m]) //显示字符
}
playflag=0
count=0x00
for(m=0m<16m++)
RXDdata[m]=0x20//清显存单元
}
}
/*********************************************************
主函数
*********************************************************/
void main(void)
{
P0 = 0xff
P2 = 0xff
SCON=0x50 //设定串口工作方式
PCON=0x00 //波特率不倍增
TMOD=0x20 //定时器1工作于8位自动重载模式, 用于产生波特率
EA=1
ES = 1 //允许串口中断
TL1=0xfd
TH1=0xfd//波特率9600
TR1=1
lcd_init()
lcd_pos(0x00) //设置显示位置为第一行
for(m=0m<16m++)
lcd_wdat(cdis1[m]) //显示字符
lcd_pos(0x40) //设置显示位置为第二行
for(m=0m<16m++)
lcd_wdat(cdis2[m]) //显示字符
while(1)
{
play()
}
}
/*********************************************************/
ICC的 电脑串口发送给单片机,中断返回数据。#include<拍昌iom8v.h>
#include<袭宴扒macros.h>
#define uchar unsigned char
#define uint unsigned int
#define BAND 9600
void init_uarst()
{
UCSRB=0x00
UCSRA=0X00
UCSRC= BIT(URSEL)|0X06
UBRRL=(11059200/BAND/16-1)%256
UBRRH=(11059200/BAND/祥桐16-1)/256
UCSRB=0x98
}
void put_char(uchar c)
{
while(!(UCSRA&(1<<UDRE)))
UDR=c
}
#pragma interrupt_handler uart:12
void uart()
{
uchar i
while(!(UCSRA&BIT(RXC)))
i=UDR
put_char(i)
}
void main()
{
init_uarst()
SREG|=0x80
while(1)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)