406514993MCU DIY进程帖
数码管显示程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,bai,shi,ge;
sbit dula=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uchar bai,uchar shi,uchar ge);
void delay(uint z);
void init();
void main()
{
init();//初始化子程序
while(1)
{
if(aa==20)
{
aa=0;
temp++;
if(temp==100)
{
temp=0;
}
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
}
display(bai,shi,ge);
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
P2=0x00;
P0=0xfe;
P2=0xff;
delay(1);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
P2=0x10;
P0=0xfd;
P2=0xff;
delay(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
P2=0x20;
P0=0xfb;
P2=0xff;
delay(1);
}
void init()
{
P2=0xff;
dula=0;
temp=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
LCD1602液晶显示程序:分2行显示。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^4;
sbit rw=P2^5;
sbit lcden=P2^6;
uchar table1[]="JX-JA MCU";
uchar table2[]="1234567654321";
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
void delay1(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void write_com(uchar com)
{
P0=com;
rs=0;
rw = 0;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
void write_date(uchar date)
{
P0=date;
rs=1;
rw = 0;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
void init()
{
write_com(0x38);
delay(20);
write_com(0x0f);
delay(20);
write_com(0x06);
delay(20);
write_com(0x01);
delay(20);
}
void main()
{
uchar a;
init();
write_com(0x80+17);
delay(20);
for(a=0;a<9;a++)
{
write_date(table1[a]);
delay(20);
}
write_com(0xc0+17);
delay(50);
for(a=0;a<13;a++)
{
write_date(table2[a]);
delay(40);
}
for(a=0;a<16;a++)
{
write_com(0x18);
delay1(200);
}
while(1);
}
LCD12864液晶显示程序:在LCD上画一个圆。
#include<reg52.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define Lcd_DatBus P0
sbit rs=P2^4;
sbit rw=P2^5;
sbit en=P2^6;
sbit PSB=P2^1;
uchar table[]={"我们是都好孩子!"};
uchar GDRAM_hbit=0;
uchar GDRAM_lbit=0;
/****************************************************************
名 称:delay1ms
功 能:延时约1ms
参 数:uchar n
返回值:无
*****************************************************************/
void delayms(uchar z)
{
uchar x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
/*********************************************************
名 称: write_com
功 能:对液晶写控制命令
参 数:com——控制命令
返回值:无
*********************************************************/
void Write_com(uchar com)
{
uchar temp=0;
rs=0;
rw=1;
do //判忙
{
en=1;
delayms(1);
temp=P0;
en=0;
}
while(temp&0x80);
rw=0;
P0=com;
delayms(1);
en=1;
delayms(1);
en=0;
}
/********************************************************
名 称:write_dat
功 能:向液晶写入数据
参 数:dat——显示数据
返回值:无
*********************************************************/
void Write_data(uchar dat)
{
uchar temp=0;
rs=0;
rw=1;
do //判忙
{
en=1;
delayms(1);
temp=P0;
en=0;
}
while(temp&0x80);
rs=1;
rw=0;
P0=dat;
en=1;
delayms(1);
en=0;
}
/**********读取当前地址的LCD显示数据**********/
uchar Read_data()
{
uchar shuju;
P0=0xff;
rs=1; // D/I=1,代表数据
rw=1; // R/W=1.读取
delayms(10);
en=1;
delayms(100);
shuju=P0; //读取当前显示的数据
en=0;
return(shuju);
}
/*******************************************
函数名称:Draw_TX
功 能:显示一个16*16大小的图形
参 数:Yaddr--Y地址
Xaddr--X地址
dp--指向图形数据存放地址的指针
返回值 :无
********************************************/
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * p)
{
uchar j;
uchar k=0;
Write_com(0x01); //清屏,只能清除DDRAM
Write_com(0x34); //使用扩展指令集,关闭绘图显示
for(j=0;j<16;j++)
{
Write_com(Yaddr++); //Y地址
Write_com(Xaddr); //X地址
Write_data(p[k++]);
Write_data(p[k++]);
}
Write_com(0x36); //打开绘图显示
Write_com(0x30); //回到基本指令集模式
}
/**************************************************************
名 称:clear_DGRAM
功 能:清除液晶GDRAM中的随机数据
参 数:无
返回值:无
**************************************************************/
void clear_GDRAM(void)
{
uchar i,j,k;
Write_com(0x34); //打开扩展指令集
i=0x80;
for(j=0;j<32;j++)
{
Write_com(i++);
Write_com(0x80);
for(k=0;k<16;k++)
{
Write_data(0x00);
}
}
i=0x80;
for(j=0;j<32;j++)
{
Write_com(i++);
Write_com(0x88);
for(k=0;k<16;k++)
{
Write_data(0x00);
}
}
Write_com(0x30); //回到基本指令集
}
/****************************
画点函数:Write_Point()
x表示列,y表示为行。
******************************/
void Write_Point(uchar x,uchar y,uchar flag)
{
uchar x_dyte,x_byte; //定义列地址的字节位,及在字节中的哪1位
uchar y_dyte,y_byte; //定义为上下两个屏(取值为0,1),行地址(取值为0~31)
Write_com(0x36); //绘图模式命令
/***X,Y坐标互换,即普通的X,Y坐标***/
x_dyte=y/16; //计算在16个字节中的哪一个
x_byte=y&0x0f; //计算在该字节中的哪一位
y_dyte=x/32; //0为上半屏,1为下半屏
y_byte=x&0x1f; //计算在0~31当中的哪一行
Write_com(0x80+y_byte); //设定行地址(y坐标)
Write_com(0x80+x_dyte+8*y_dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏
Read_data();
GDRAM_hbit=Read_data(); //读取当前显示高8位数据
GDRAM_lbit=Read_data(); //读取当前显示低8位数据
delayms(5);
if(flag==1)
{
Write_com(0x80+y_byte); //设定行地址(y坐标)
Write_com(0x80+x_dyte+8*y_dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏
delayms(5);
if(x_byte<8) //判断其在高8位,还是在低8位
{
Write_data(GDRAM_hbit|(0X01<<(7-x_byte))); //显示GDRAM区高8位数据
Write_data(GDRAM_lbit); //显示GDRAM区低8位数据
}
else
{
Write_data(GDRAM_hbit);
Write_data(GDRAM_lbit|(0x01<<(15-x_byte)));
}
}
else
{
Write_data((0x00)); //清除GDRAM区高8位数据
Write_data((0x00)); //清除GDRAM区低8位数据
}
}
/***********************************************************
名称:Write_Line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char colour)
功能:在指定位置上画线。
入口参数:x0 指定线起点所在行的位置
y0 指定线起点所在列的位置
x1 指定线终点所在行的位置
y1 指定线终点所在列的位置
flag 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
/**********************************************************/
void Write_Line(uchar x0,uchar y0,uchar x1,uchar y1,uchar flag)
{
int temp;
int dx,dy; //定义起点到终点的横、纵坐标增加值
int s1,s2,i,j;
int Dx,Dy,k;
dx=x1-x0;
if(dx>=0) //X的方向是增加的
s1=1;
else //X的方向是降低的
s1=-1;
dy=y1-y0; //判断Y的方向是增加还是降到的
if(dy>=0)
s2=1;
else
s2=-1;
Dx=abs(x1-x0); //计算横、纵标志增加值的绝对值
Dy=abs(y1-y0);
if(Dy>Dx)
{ //以45度角为分界线,靠进Y轴是status=1,靠近X轴是status=0
temp=Dx;
Dx=Dy;
Dy=temp;
j=1;
}
else
j=0;
/*********Bresenham算法画任意两点间的直线********/
k=2*Dy-Dx; //第1次判断下个点的位置
for(i=0;i<Dx;i++)
{
Write_Point(x0,y0,flag); //画点
if(k>=0)
{
if(j==1) //在靠近Y轴区,x值加1
x0+=s1;
else //在靠近X轴区,y值加1
y0+=s2;
k-=2*Dx; //判断下下个点的位置
}
if(j==1)
y0+=s2;
else
x0+=s1;
k+=2*Dy;
}
}
/****************************************************************************
名称:plotC(int x,int y,int xc,int yc,unsigned char colour)
功能:八分点画圆函数
入口参数:x 指定线起点所在行的位置
y 指定线起点所在列的位置
color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
****************************************************************************/
void plotC(uint x,uint y,uint xc,uint yc,uchar colour)
{
Write_Point(xc+x,yc+y,colour);
Write_Point(xc+x,yc-y,colour);
Write_Point(xc-x,yc+y,colour);
Write_Point(xc-x,yc-y,colour);
Write_Point(xc+y,yc+x,colour);
Write_Point(xc+y,yc-x,colour);
Write_Point(xc-y,yc+x,colour);
Write_Point(xc-y,yc-x,colour);
}
/****************************************************************************
名称:Write_yuan(int xc,int yc,int r,unsigned char colour)
功能:画圆
入口参数:xc 圆心的行坐标
yc 圆心的列坐标
r 半径
color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
****************************************************************************/
void Write_yuan(uint xc,uint yc,uint r,uchar colour)
{
int x,y,d;
y=r;
d=3-2*r;
x=0;
while(x<=y)
{
plotC(x,y,xc,yc,colour);
if(d < 0)
d+=(4*x)+6;
else
{
d+=(4*(x-y))+10;
y=y-1;
}
x=x+1;
}
}
/********************实心圆*********************/
/****************************************************************************
名称:Write_yuan2(uint x, uint y, uint r,uchar flag)
功能:用绘图的方法填充一个矩形
入口参数:x 圆心横坐标
y 圆心纵坐标
r 半径长度
flag 颜色标志位,为1.
****************************************************************************/
void Write_yuan2(uint x, uint y, uint r,uchar flag)
{
uint dx,dy,ref;
uint Temp;
if(r==0)return;
dx=r;
dy=1;
ref=707*r/1000; // 0.707r
while(dy<=dx)
{
if(dx>ref)
Write_Line(x+ref+1,y+dy,x+dx,y+dy,flag);
if(x>=ref+1&&dx>ref)
{
if(x<dx)
Temp=0;
else
Temp=x-dx;
Write_Line(Temp,y+dy,x-ref-1,y+dy,flag);
}
if(y>=dy&&dx>ref)
Write_Line(x+ref+1,y-dy,x+dx,y-dy,flag);
if(x>=ref+1&&y>=dy&&dx>ref)
{
if(x<dx)
Temp=0;
else
Temp=x-dx;
Write_Line(Temp,y-dy,x-ref-1,y-dy,flag);
}
if(dy!=dx||dx==ref)
{
if(y<dx)
Temp=0;
else
Temp=y-dx;
Write_Line(x+dy,Temp,x+dy,y+dx,flag);
}
if(x>=dy&&(dy!=dx||dy==ref))
{
if(y<dx)
Temp = 0;
else
Temp=y-dx;
Write_Line(x-dy,Temp,x-dy,y+dx,flag);
}
dy++;
if((r*r-dy*dy)<=(dx-1)*dx)
dx--;
}
Write_Line(x+ref+1,y,x+r,y,flag);
if(x>=ref+1)
{
if(x<r)
Temp=0;
else
Temp=x-r;
Write_Line(Temp,y,x-ref-1,y,flag);
if(y<r)
Temp=0;
else
Temp=y-r;
Write_Line(x,Temp,x,y+r,flag);
}
}
/****************************************************************************
名称:Write_Full(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char colour)
功能:用绘图的方法填充一个矩形
入口参数:x0 起始点横坐标
y0 起始点纵坐标
x1 终止点横坐标
y1 终止点纵坐标
color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
****************************************************************************/
void Write_Full(uchar x0,uchar y0,uchar x1,uchar y1,uchar colour)
{
uchar i,j;
for(j=y0;j<=y1;j++)
for(i=x0;i<=x1;i++)
Write_Point(i,j,colour);
}
/********************************************************
名 称:LCD_init
功 能:初始化12864液晶
*********************************************************/
void LCD_init(void)
{
Write_com(0x30); //基本指令集
delayms(1);
Write_com(0x02); //地址归位
delayms(1);
Write_com(0x0c); //整体显示打开,游标关闭
delayms(1);
Write_com(0x01); //清除显示屏
delayms(1);
Write_com(0x06); //游标右移
delayms(1);
Write_com(0x80); //设定显示的起始地址
}
void main ()
{
uchar i=0;
LCD_init();
Write_com(0x01);
Write_com(0x80);
for(i=0;i<16;i++)
{
Write_data(table[i]);
delayms(5);
}
clear_GDRAM();
Write_Line(20,1,62,125,1);
Write_Line(62,1,62,125,1);
Write_Line(20,1,62,1,1);
Write_yuan(40,40,10,1);
Write_yuan2(40,90,20,1);
Write_Line(40,1,40,30,1);
Write_Line(40,30,60,30,1);
Write_Line(60,30,60,1,1);
Write_Line(60,1,40,1,1);
Write_Full(40,1,60,30,1);
while(1);
}
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |