单片机控制12864产生正弦波的程序(原创)
12864教程画点画线换正弦波(非常完整)有程序

功能:选择 4 行中的任一行作反白显示,并可决定反白与否。第一次设定为反白显示,再次 设定时为正常显示
正常 15. 睡眠模式(15H)
0x04
0x05
0x06/0x07
功能:SL=1:脱离睡眠模式; SL=0:进入睡眠模式(外观上和清屏相同)。 16. 扩充功能设定(16H)
功能:DL=1:8-BIT 控制接口; DL=0:4-BIT 控制接口 RE=1:扩充指令集动作; RE=0:基本指令集动作 G=1:绘图显示 ON; G=0:绘图显示 OFF
10. 写资料到 RAM
功能:写入资料到内部的 RAM(DDRAM/CGRAM/GDRAM),每个 RAM 地址 都要连续写入两个字节的资料。 11. 读出 RAM 的值
功能:从内部 RAM 读取数据(DDRAM/CGRAM/GDRAM),当设定地址指令后,若需 读取数据时需先执行一次空的读数据,才会读取到正确数据,第二次读取时则不需要,除非 又下设定地址指令
//大于100uS 的延时程序
write_com(0x01); //Display Clear
delay(10);
//大于10mS 的延时程序
write_com(0x06); //Enry Mode Set,光标从右向左加1位移动
delay(100);
//大于100uS 的延时程序
}
显示图片的初始化函数:
instruction set, G=0 :graphic display OFF
delay(100);
//大于100uS 的延时程序
write_com(0x30); //Function Set
delay(37);
////大于37uS 的延时程序
用单片机产生正弦波程序

用单片机产生正弦波程序Document serial number [UU89WT-UU98YT-UU8CB-UUUT-UUT108] 用单片机产生正弦波程序要用到数模转换DAC0832MOV DPTR, #SINTAB ;正弦表写入内部RAM6DH-7FH MOV R0,#6DHLOOP: CLR AMOVC A, @A+DPTRMOV @R0, AINC DPTRINC ROCJNE RO,#80H, LOOPMOV DPTR, #7FFFH ;设置D/A转换器的端口地址MOV R0,#6DH ;设置正弦表指针LOOP1: MOV A, @R0 ;查表MOVX @DPTR, A ; D/A 转换ACALL DELAY ;延时,等待转换结束DEC RO ;正弦表位移量增量CJNE RO, #6DH, LOOP1 ;第一象限输出完LOOP2: MOV A, @R0 ;査表MOVX @DPTR, A ; D/A 转换acall DELAY ;延时,等待转换结束DEC RO ;正弦表位移量减量CJNE RO, #6DH, L00P2 ;第二象限输出完LOOP3: MOV A, @R0 ;查表CPL A ;表值取反MOVX @DPTR, A ;D/A 转换ACALL DELAY ;延时,等待转换结束INC RO ;正弦表位移量增量CJNE RO, #7FH, LOOP3 ;第三象限输出完L00P4: MOV A, @R0 ;查表CPL A ;表值取反MOVX @DPTR, A ;D/A 转换ACALL DELAY ;延时,等待转换结束DEC RO ;正弦表位移量减量CJNE RO, #6DH, L00P4 ;第四象限输出完SJMP LOOP1DELAY:MOV R7, #200 ;延时50msDELI:MOV R6,#123NOPDEL2: JNZ R6, DEL2DJNZ R7, DELIRET SINTAB:DB 80H, 83H, 86H, 89H, SDH, 90H, 93H, 96HDB 99H, 9CH, 9FH, 0A2H, 0A5H, 0A8H, OABH, OAEH DB OB1H, 0B4H, OB7H, OBAH, OBCH, OBFH, 0C2H,0C5HDB OC7H, OCAH, OCCH, OCFH,OD1H, 0D4H, 0D6H, 0D8H DB ODAH, ODDH, ODFH, OE1H, 0E3H, 0E5H, OE7H, 0E9H DB OEAH, OECH, OEEH, OEFH, OF1H, 0F2H, 0F4H, 0F5H DB 0F6H, 0F7H, 0F8H, 0F9H, OFAH,OFBH,OFCH, OFDH DB OFDH, OFEH, OFFH, OFFH, OFFH, OFFH, OFFH, OFFH DB OFFH, OFFH, OFFH, OFFH,OFFH, OFFH, OFEH, OFDH DB OFDH, OFCH, OFBH, OFAH, 0F9H, 0F8H, OF7H, 0F6H DB OF5H, 0F4H, 0F2H, OF1H, OEFH, OEEH, OECH, OEAHDB 0E9H, 0E7H, 0E5H, 0E3H, OE1H, ODEH, ODDH, ODAHDB 0D8H, 0D6H, 0D4H, OD1H, OCFH, OCCH,OCAH, 0C7HDB 0C5H, 0C2H, OBFH, OBCH, OBAH, OB7H, 0B4H, OB1H DB 96H, 93H, 90H, SDH, 89H, 86H, 83H, 80H DB 80H, 7CH, 79H, 78H, 72H, 6FH, 6CH, 69H DB 66H, 63H, 60H, 5DH, 5 AH, 57H, 55H, 51H DB 4EH, 4CH, 48H, 45H, 43H, 40H, 3DH, 3 AH DB 38H, 35H, 33H, 30H, 2EH, 2BH, 29H, 27H DB 25H, 22H, 20H, 1EH, 1CH, 1AH, 18H, 16H OAEH, OABH, 0A8H, 0A5H,0A2H, DB 9FH, 9CH, DB 15H, 13H, 11H, 1OH, OEH, ODH, OBH, OAH99HDB 09H, OSH, O7H, 06H, 05H, 04H, 03H, 02HDB 02H, O1H, OOH, OOH, OOH, OOH, OOH, OOH DB OOH, OOH, OOH, OOH, OOH, OOH, O1H, 02H DB 02H, 03H, 04H, 05H, 06H, O7H, OSH, 09H DB OAH, OBH, ODH, OEH, 1OH, 11H, 13H, 15H DB 16H, 18H, 1AH, 1CH, 1EH, 2OH, 22H, 25H DB 27H, 29H, 2BH, 2EH, 30H, 33H, 35H, 38H DB 3 AH, 3DH, 40H, 43H, 45H, 48H, 4CH, 4EH DB 51H, 55H, 57H, 5 AH, SDH, 60H, 63H, 66HDB 69H, 6CH, 6FH, 72H, 76H, 79H, 7CH, 80H END。
用12864做示波器(程序和图)

#include <reg51.h>#include <intrins.h>#include <ADC0808.c>sbit DI=P2^2; // 数据\指令选择sbit RW=P2^1; // 读\写选择sbit E=P2^0; // 读\写使能sbit CS1=P2^4; // 片选1sbit CS2=P2^3; // 片选2sbit busy=P1^7;sbit jia=P3^7;sbit jian=P3^3;sbit jia1=P3^0;sbit jian1=P3^1;unsigned int i;unsigned char ye,lei,shu; unsigned char a[94];char code t[]={0x00,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x40,0x60,0x80,0x00,0x7F,0xFF, //小0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x82,0x00,0x82,0x00,0x82,0x40,0x82,0x80,0x82,0x7F,0xE2, //子0x00,0xA2,0x00,0x92,0x00,0x8A,0x00,0x86,0x00,0x80,0x00,0xC0,0x00,0x80,0x00,0x00,0x00,0x40,0x00,0x60,0x3F,0x5E,0x01,0x48,0x01,0x48,0xFF,0xFF,0x11,0x48,0x21,0x4C, //制0x1F,0x68,0x00,0x40,0x07,0xF8,0x40,0x00,0x80,0x00,0x7F,0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x40,0x00,0x20,0xFF,0xF8,0x00,0x87,0x00,0x40,0x00,0x30,0x00,0x0F, //作0xFF,0xF8,0x08,0x88,0x08,0x88,0x08,0xC8,0x0C,0x88,0x08,0x0C,0x00,0x08,0x00,0x00,};void checkstate(){//bit dat;DI=0;RW=1;//P1=0x00;do{E=1;E=0;//仅当第7位为0时才可操作(判别busy信号)}while(busy==1);}void writecommand(unsigned char command) //写命令{checkstate();DI=0;RW=0;P1=command;E=1;E=0;}void writedate(unsigned char date) //写数据{checkstate();DI=1;RW=0;P1=date;E=1;E=0;}void pianxuan(unsigned int i){if(i==1)CS1=0,CS2=1;if(i==2)CS1=1,CS2=0;if(i==3)CS1=0,CS2=0;}void cleanscreen() //清屏{unsigned char page,i;for(page=0xb8;page<0xc0;page++){writecommand(page);writecommand(0x40);for(i=0;i<64;i++)writedate(0x00);}}void init(void) //开显示,起始行0行{writecommand(0xc0);writecommand(0x3f);}void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}void shuju(){pianxuan(i); writecommand(ye); writecommand(lei); writedate(shu);}void qing(){uchar i;for(i=0xb8;i<=0xbf;i++) {ye=i;shu=0x00;shuju();}}void main(){uint r,j,g=0,q,dianya=1,k,p;uchar U,m,l;pianxuan(3);cleanscreen();init();pianxuan(2);l=0xb8;for(k=0;k<4;k++,l=l+0x02){ye=l;lei=0x70;for(r=0;r<16;r++){shu=t[2*r+1+32*k];shuju();lei++;}ye=l+0x01;lei=0x70;for(r=0;r<16;r++){shu=t[2*r+32*k];shuju();lei++;}}while(1){uchar d1,d2,d3,d4,d5;aaa:do{adc();}while((AD!=128)&&(AD!=129)&&(AD!=130));U=AD;adc();if(U>AD)goto aaa;while(jia==0){while(jia==0);g=g+1;}while(jian==0){while(jian==0);if(g!=0) g=g-1;}while(jia1==0){while(jia1==0);dianya=dianya+1;}while(jian1==0){while(jian1==0);if(dianya!=1) dianya=dianya-1;}for(j=0;j<94;j++) //AD采样{adc();a[j]=AD;delay_50us(g);}lei=0x40;for(r=0,j=0;r<94;r++,j++){if(j<64) i=1;if(j==64) lei=0x40;if(j>=64)i=2;qing(); //清掉之前的内容AD=a[j]*0.196/dianya; //计算在12864的电压值if(AD<=7) ye=0xbf,shu=(0x80>>AD); else if(AD<=15) ye=0xbe,shu=0x80>>(AD-8); else if(AD<=23) ye=0xbd,shu=0x80>>(AD-16); else if(AD<=31) ye=0xbc,shu=0x80>>(AD-24); else if(AD<=39) ye=0xbb,shu=0x80>>(AD-32); else if(AD<=47) ye=0xba,shu=0x80>>(AD-40); else if(AD<=55) ye=0xb9,shu=0x80>>(AD-48); else if(AD<=63) ye=0xb8,shu=0x80>>(AD-56);if(r==0){d1=shu;d2=ye;}if(r!=0){d3=shu;d4=ye;if(ye==d2){if(shu>d1){d5=shu;d5=d5>>1;while(d5!=d1){d5=d5>>1;shu=shu|(shu>>1);}}if(shu<d1){d5=shu;d5=d5<<1;while(d5!=d1){d5=d5<<1;shu=shu|(shu<<1);}}if(ye<d2){for(q=0;q<7;q++){shu=shu|(shu<<1);}shuju();ye++;while(ye<d2) {shu=0xff,shuju(),ye++;}if(ye==d2){shu=0x01;if(shu<d1){d5=shu;d5=d5<<1;while(d5!=d1){d5=d5<<1;shu=shu|(shu<<1);}}}}if(ye>d2){for(q=0;q<7;q++){shu=shu|(shu>>1);}shuju();ye--;while(ye>d2) {shu=0xff,shuju(),ye--;}if(ye==d2){shu=0x80;if(shu>d1){d5=shu;d5=d5>>1;while(d5!=d1){d5=d5>>1;shu=shu|(shu>>1);}}}}}if(r!=0)d1=d3;d2=d4;}shuju();if(lei!=0x7f) lei++; }}}。
基于单片机片内dac数模转换器的产生正弦波信号的应用编程

基于单片机片内dac数模转换器的产生正弦波信号的应用编程在基于单片机的应用中,使用片内DAC(数模转换器)产生正弦波信号是一个常见的需求。
下面是一个基本的步骤和代码示例,展示了如何使用单片机和DAC来生成正弦波信号。
步骤概览1. 配置单片机:初始化单片机,配置DAC和其他必要的硬件。
2. 计算正弦波数据:根据所需的频率和幅度,计算正弦波的样本值。
3. 发送数据到DAC:将计算出的样本值发送到DAC以生成正弦波。
示例代码(伪代码)```cinclude <>include <>define SAMPLE_RATE 44100 // 采样率,可以根据需要调整define FREQUENCY 440 // 频率,单位Hzdefine PI // 圆周率define MAX_AMPLITUDE 1023 // DAC的最大幅度,根据DAC规格调整// 初始化DAC和其他硬件void init_hardware() {// ...}// 计算正弦波样本值int calculate_sine_wave(int sample_number) {double angle = 2 PI sample_number / SAMPLE_RATE;return (int)(MAX_AMPLITUDE sin(angle)); // 返回-MAX_AMPLITUDE 到 MAX_AMPLITUDE 的值}// 主函数int main() {init_hardware(); // 初始化硬件for (int sample_number = 0; sample_number < SAMPLE_RATE; sample_number++) {int sine_wave_sample = calculate_sine_wave(sample_number); // 计算正弦波样本值// 将sine_wave_sample发送到DAC以生成正弦波// ...}return 0;}```注意事项硬件配置:具体配置单片机和DAC的代码取决于你所使用的硬件平台和开发环境。
基于MSP430单片机生成正弦波程序

}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
}
void disnum(unsigned long int x)
#define ad9850_rest_up P2OUT|=BIT2 ; //P2.2口接ad9850的rest脚上升沿
#define ad9850_rest_dw P2OUT&=~BIT2; //P2.2口接ad9850的rest脚下降沿
void ad9850_reset();
void ad9850_wr_parrel(unsigned char w0,double frequence);
//写w2数据
w=(y>>16);
P5OUT=w; //w2
ad9850_w_clk_up;
ad9850_w_clk_dw;
//写w3数据
w=(y>>8);
P5OUT=w; //w3
ad9850_w_clk_up;
ad9850_w_clk_dw;
//写w4数据
w=(y>>0);
P5OUT=w; //w4
# define EN0 P3OUT&=~BIT2;
# define EN1 P3OUT|=BIT2;
# define uint unsigned int
# define uchar unsigned char
void delayms(uint n);
void busyornot();
12864显示正弦波(周期幅值可调)

//****************************************************************************// **用51实现LCD12864显示正弦波**周期和幅值都是可调的//****************************************************************************//#include <reg52.h>#include <math.h>#define uchar unsigned char#define uint unsigned intsbit rs=P1^2;sbit rw=P1^1;sbit e=P1^0;sbit key1=P1^6;sbit key2=P1^7;void delay_50us(uint x){uchar i,j;for(i=0;i<x;i++)for(j=0;j<10;j++);}void du_mang(void) //忙信号检测{rs=0;rw=1;e=1;P0=0xff;while((P0&0x80)==0x80);e=0;}void send_com(uchar com_data) //写指令{du_mang();rs=0;rw=0;e=1;P0=com_data;delay_50us(5);e=0;delay_50us(5);}void send_data(uchar tab_data) //写数据{//du_mang();rs=1;rw=0;e=1;P0=tab_data;delay_50us(5);e=0;delay_50us(5);}void init(void) //初始化函数{delay_50us(10);send_com(0x30);// delay_50us(1);send_com(0x30);// delay_50us(1);send_com(0x0c);// delay_50us(1);send_com(0x01);// delay_50us(1);send_com(0x06);delay_50us(1);}void clrgdram(void) //清除GDRAM {uchar x,y;for(y=0;y<64;y++) //64行for(x=0;x<16;x++) //16列{send_com(0x34);send_com(y+0x80); //行地址send_com(x+0x80); //列地址send_com(0x30);send_data(0x00);send_data(0x00);}}uchar readbyte(void)uchar byreturnvalie;du_mang();P0=0xff;rs=1;rw=1;e=0;e=1;byreturnvalie=P0;e=0;return byreturnvalie;}void huadian(uchar x,uchar y,uchar color) //画点函数{uchar row,tier,tier_bit;uchar readH,readL;send_com(0x34);send_com(0x36);tier=x>>4;tier_bit=x&0x0f;if(y<32){row=y;}else{row=y-32;tier+=8;}send_com(row+0x80);send_com(tier+0x80);readbyte();readH=readbyte();readL=readbyte();send_com(row+0x80);send_com(tier+0x80);if(tier_bit<8){switch(color){case 0: readH&=(~(0x01<<(7-tier_bit)));break;case 1: readH|=(0x01<<(7-tier_bit));break;case 2: readH^=(0x01<<(7-tier_bit));break;default:break;}send_data(readH);send_data(readL);}else{switch(color){case 0: readL&=(~(0x01<<(15-tier_bit)));break;case 1: readL|=(0x01<<(15-tier_bit));break;case 2: readL^=(0x01<<(15-tier_bit));break;default:break;}send_data(readH);send_data(readL);}send_com(0x30);}void main(void){uchar i,j,colour=1;uchar m=10,n=30;init();clrgdram();send_com(0x01);delay_50us(10);while(1){for(i=4;i<124;i++){if(key1==0){m+=5; //改变幅值while(!key1);clrgdram();}if(key2==0){n+=5; //改变周期while(!key2);clrgdram();}j=35-m*sin((i-4)*3.14/n);huadian(i,j,colour);}}}。
51单片机示波器制作(12864显示带字库)

51单⽚机⽰波器制作(12864显⽰带字库)⾸先说明:我才接触51单⽚机3个星期(6⽉8号才⾼考完),对C语⾔还很陌⽣。
我就是⼀个萌新,还希望⼤佬们多多指导。
12864(带字库st7920驱动)为显⽰器,XPT2046为AD转换芯⽚。
(不要问我为什么⽤这个芯⽚,开发板⾃带的坑货。
我在⽹上下载的⽰波器程序⼤多以ADC0832或ADC0808为AD转换芯⽚,结果我都⽤不了,所以才被迫⾃写程序。
)⽰波器程序由main.c XPT2046.c XPT2046.h三个⼦⽂件构成,main.c是我根据⽹上的⼀个12864画图程序改编⽽成我也加了⼀些注释,后⾯两个⽂件取⾃开发板⾃带的例程并进⾏了修改。
所以说这个程序基本上不是我编写的,也有很多问题和不⾜之处还请指正。
下⾯是效果图。
⾸先是⽅波。
由于没有函数发⽣器,就只能通过⼿机播放只做好的正弦⾳频,再检测⼿机⽿机接⼝信号。
不知道为什么,正弦波有⼀半不见了,似乎是由于不能检测到负电压还是什么的。
下⾯贴出main.c 的代码。
01.#include <reg52.h>02.#include"XPT2046.h" 03.#define uint unsigned int 04.#define uchar unsigned char05.06.sbit RS=P2^6; //LCD 数据或命令选择端07.sbit RW=P2^5; //LCD 写⼊或读出选择端08.sbit RST=P1^0; //LCD 复位端⼝09.sbit LCDE=P2^7; // LCD 使能端10.sbit PSB=P3^2;//串⾏或并⾏选择端11.12. void delay(uchar i)13. {14. while(i--);15. } //延时函数,i=1时延时约10微秒(12M晶振)16.17. void SPI_Start()18. {19. CLK = 0;20. CS = 1;21. DIN = 1;22. CLK = 1;23. CS = 0;24. } //ADC芯⽚(XPT2046)初始化函数25.26. void lcd_busy()27.28. {29.30. RS=0;31.32. RW=1;33.34. P0=0XFF;35.36. LCDE=1;37.38. delay(14);39.40. while((P0&0x80)==0x80);41. LCDE=0;42.43. }//LCD12864(st7920驱动)查忙函数44.45. void write_com(uchar com)46.47. {48.49. lcd_busy();RS=0;50.51. RW=0;52.53. LCDE=0;54.55. P0=com;56.57. delay(9);58.59. LCDE=1;60.61. delay(9);62.63. LCDE=0;64.65. }//LCD写指令函数66.67. void write_num(uchar num)68.69. {70.71. lcd_busy();72.73. RS=1;75. RW=0;76.77. LCDE=0;78.79. P0=num;80.81. delay(7);82.83. LCDE=1;84.85. delay(9);86.87. LCDE=0;88.89. }//LCD写数据函数90.91. uchar read_data()92.93. {94.95. uchar read;96.97. lcd_busy();98.99. RS=1;100.101. RW=1;102.103. LCDE=0;104.105. delay(7);106.107. LCDE=1;108.109. delay(9);110.111. read=P0;112.113. LCDE=0;114.115. delay(11);;116.117.118.119. return read;120.121. } //LCD读数据函数122.123. void clear_lcd()124.125. {126.127. uchar i,j;128.129. write_com(0x34);130.131. for(i=0;i<32;i++) //因为LCD有纵坐标32格所以写三⼗⼆次132.133. {134.135. write_com(0x80+i); //先写⼊纵坐标Y的值137. write_com(0x80); //再写⼊横坐标X的值138.139. for(j=0;j<32;j++) //横坐标有16位,每位写⼊两个字节的的数据,也就写⼊32次140.141. { //因为当写⼊两个字节之后横坐标会⾃动加1,所以就不⽤再次写⼊地址了。
双通道相位差可调正弦信号发生器程序(AD9850,12864显示)

/******************************************************************************主程序部分******************************************************************************/ #include<reg52.h>#include<intrins.h>#include<12864.h>#include<AD9850.h>#include<IR.h>#define uchar unsigned char#define uint unsigned intuchar h1[]={"CH1: Hz "};uchar h2[]={"CH2: Hz "};uchar h3[]={"Δφ: . ° "};uchar h4[]={"V1:2.3V V2:2.3V"};long int fa=1000,fb=1000,ph=0,f=0;//定义A、B通道初始频率,初始相位,频率中间变量long int ph_disp=0;//相位显示变量,实际相位增量为11.25时,控制字增量为8long int n=0;//Vol+或V ol-按下的次数,在相位显示时用uchar h=2;//定义行参数,初始显示为第二行bit H_ok=1;//行选择完成标志位bit Num_ok=1;//数字输入完成标志位bit Step_ok=1;//步进输入完成标志位bit Sel_ok=1;//选择成功标志位bit LCD_ok=1;//写LCD完成标志位bit AD9850_ok=1;//写AD9850完成标志位void change()//将实际数值在12864上显示进行要的处理{h1[7]='0'+fa/100000;h1[8]='0'+fa/10000%10;h1[9]='0'+fa/1000%10;h1[10]='0'+fa/100%10;h1[11]='0'+fa/10%10;h1[12]='0'+fa%10;if(h==1)if(Sel_ok==1) h1[15]='*';//显示当前所在行else h1[15]='-';//数字输入等待状态显示-else h1[15]=' ';//调整项不在此行显示为空h2[7]='0'+fb/100000;h2[8]='0'+fb/10000%10;h2[9]='0'+fb/1000%10;h2[10]='0'+fb/100%10;h2[11]='0'+fb/10%10;h2[12]='0'+fb%10;if(h==2)if(Sel_ok==1) h2[15]='*';else h2[15]='-';else h2[15]=' ';ph_disp=n*100*11.25;h3[6]='0'+ph_disp/10000;h3[7]='0'+ph_disp/1000%10;h3[8]='0'+ph_disp/100%10;h3[10]='0'+ph_disp/10%10;h3[11]='0'+ph_disp%10;if(h==3)if(Sel_ok==1) h3[15]='*';else h3[15]='-';else h3[15]=' ';}void LCD_Display()//12864整屏显示{change();DisplayListChar(0,0,h1);DisplayListChar(0,1,h2);DisplayListChar(0,2,h3);DisplayListChar(0,3,h4);}void H_sel()//行参数选择{switch(IRcord[2]){case 0x1b:h--;if(h<1) h=3;H_ok=1;break;//ch+ case 0x1f:h++;if(h>3) h=1;H_ok=1;break;//ch- default:break;}irpro_ok=0;}void Step_sel(void)//步进输入{switch(IRcord[2])//判断红外遥控用户码值{case 0x1a://*********************************vol+if(h==3) {ph+=8;if(ph>0xf8)ph=0;n++;if(n>31)n=0;Step_ok=1;}elseif(h==1){ph=0;n=0;fa++;if(fa>999999) fa=999999;Step_ok=1;}if(h==2){ph=0;n=0;fb++;if(fb>999999) fb=999999;Step_ok=1;}break;case 0x1e://**********************************vol-if(h==3) {ph-=8;if(ph<0)ph=0xf8;n--;if(n<0)n=31;Step_ok=1;}elseif(h==1){ph=0;n=0;fa--;if(fa<0) fa=0;Step_ok=1;}if(h==2){ph=0;n=0;fb--;if(fb<0) fb=0;Step_ok=1;}break;default:break;}irpro_ok=0;}void Num_sel()//数字输入,频率可直接数字输入,相位步进输入{switch(IRcord[2])//判断用户码值{case 0x01://****************************************1f=f*10+1;if(f>999999) f=0;Num_ok=0;Sel_ok=0;if(h==1){fa=f;ph=0;n=0;LCD_Display();}if(h==2){fb=f;ph=0;n=0;LCD_Display();}//if(h==3){if(f>255) f=0;ph=0;LCD_Display();}break;case 0x02://************************************2f=f*10+2;if(f>999999) f=0;Num_ok=0;Sel_ok=0;if(h==1){fa=f;ph=0;n=0;LCD_Display();}if(h==2){fb=f;ph=0;n=0;LCD_Display();}//if(h==3){if(f>255) f=0;ph=f;LCD_Display();}break;case 0x03://************************************3f=f*10+3;if(f>999999) f=0;Num_ok=0;Sel_ok=1;if(h==1){fa=f;ph=0;n=0;LCD_Display();}if(h==2){fb=f;ph=0;n=0;LCD_Display();}//if(h==3){if(f>255) f=0;ph=f;LCD_Display();} break;case 0x04://************************************4 f=f*10+4;if(f>999999) f=0;Num_ok=0;Sel_ok=0;if(h==1){fa=f;ph=0;n=0;LCD_Display();}if(h==2){fb=f;ph=0;n=0;LCD_Display();}//if(h==3){if(f>255) f=0;ph=f;LCD_Display();} break;case 0x05://************************************5 f=f*10+5;if(f>999999) f=0;Num_ok=0;Sel_ok=0;if(h==1){fa=f;ph=0;n=0;LCD_Display();}if(h==2){fb=f;ph=0;n=0;LCD_Display();}//if(h==3){if(f>255) f=0;ph=f;LCD_Display();} break;case 0x06://************************************6 f=f*10+6;if(f>999999) f=0;Num_ok=0;Sel_ok=0;if(h==1){fa=f;ph=0;n=0;LCD_Display();}if(h==2){fb=f;ph=0;n=0;LCD_Display();}//if(h==3){if(f>255) f=0;ph=f;LCD_Display();} break;case 0x07://************************************7 f=f*10+7;if(f>999999) f=0;Num_ok=0;Sel_ok=0;if(h==1){fa=f;ph=0;n=0;LCD_Display();}if(h==2){fb=f;ph=0;n=0;LCD_Display();}//if(h==3){if(f>255) f=0;ph=f;LCD_Display();} break;case 0x08://************************************8 f=f*10+8;if(f>999999) f=0;Num_ok=0;Sel_ok=0;if(h==1){fa=f;ph=0;n=0;LCD_Display();}if(h==2){fb=f;ph=0;n=0;LCD_Display();}//if(h==3){if(f>255) f=0;ph=f;LCD_Display();} break;case 0x09://************************************9 f=f*10+9;if(f>999999) f=0;Num_ok=0;Sel_ok=0;if(h==1){fa=f;ph=0;n=0;LCD_Display();}if(h==2){fb=f;ph=0;n=0;LCD_Display();}//if(h==3){if(f>255) f=0;ph=f;LCD_Display();} break;case 0x00://************************************0f=f*10;if(f>999999) f=0;Num_ok=0;Sel_ok=0;if(h==1){fa=f;ph=0;n=0;LCD_Display();}if(h==2){fb=f;ph=0;n=0;LCD_Display();}//if(h==3){if(f>255) f=0;ph=f;LCD_Display();} break;case 0x5c:Num_ok=1;break;//********************确定case 0x57:f=f/10;if(f>999999) f=0;//***************取消Num_ok=0;Sel_ok=0;if(h==1){fa=f;ph=0;n=0;LCD_Display();}if(h==2){fb=f;ph=0;n=0;LCD_Display();}break;default:break;}irpro_ok=0;}void Num_process()//数字输入处理{if(Num_ok==1){AD9850_ok=0;Reset_AD9850();Write_AD9850(ph,0x00,fa,fb);Sel_ok=1;f=0;AD9850_ok=1;}}void Step_process()//步进输入处理{if(Step_ok==1){AD9850_ok=0;Reset_AD9850();Write_AD9850(ph,0x00,fa,fb);AD9850_ok=1;}}void IR_process(void)//红外综合处理{if(irok)//如果红外信号接收好了进行红外数据处理{Ircordpro();irok=0;}if(irpro_ok)//如果红外数据处理好后进行其他工作处理{H_sel();Step_sel();Num_sel();}}void main(){Port_init();//端口初始化TIM0init();//定时器0初始化EX0init();//外部中断0初始化LCDInit();//12864初始化LCDClear();//12864清屏LCDClear();LCD_Display();//12864显示初始内容Reset_AD9850();//AD9850复位Reset_AD9850();//AD9850复位Write_AD9850(ph,0x00,fa,fb);//AD9850写初始数据delay_1ms(10);while(1){if( (Num_ok||Step_ok)||H_ok){LCD_Display();H_ok=0;Num_ok=0;Step_ok=0;}/*只有在各项输入选择完成后才更新显示内容避免12864因写数据时受其他影响而白屏*/IR_process();Num_process();Step_process();}}/*****************************************************12864显示部分(12864.h)*****************************************************/#include <reg52.h>sfr P4=0xe8;//STC89C52RC(TQFP封装)有P4口,入口地址为0xe8sbit LCD_RS = P4^0;sbit LCD_RW = P4^1;sbit LCD_E = P4^2;sbit LCD_PSB = P3^7;#define LCD_Data P2//12864数据口,并行传送#define BUSY 0x80 //12864忙信号ReadStatusLCD()//读12864状态{LCD_RS = 0;LCD_RW = 1;LCD_E = 0;LCD_Data = 0xFF;LCD_E = 1;while (LCD_Data & BUSY);LCD_E = 0;return(LCD_Data);}void WriteCommandLCD(unsigned char WCLCD,BusyC)//写指令{if (BusyC) ReadStatusLCD();LCD_Data = WCLCD;LCD_RS = 0;LCD_RW = 0;LCD_E = 1;LCD_E = 1;LCD_E = 1;LCD_E = 0;}void WriteDataLCD(unsigned char WDLCD)//写数据{ReadStatusLCD(); //busy testLCD_RS = 1;LCD_RW = 0;LCD_Data = WDLCD;LCD_E = 1;LCD_E = 0;LCD_E = 0;LCD_E = 1;}void LCDClear(void)//清屏{WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x34,1); //显示光标移动设置WriteCommandLCD(0x30,1); //显示开及光标设置}//显示一行字符,起始坐标为(X,Y)void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData) {switch(Y){case 0:Y =0X80;break; //根据行数来选择相应地址case 1:Y=0X90;break;case 2:Y=0X88;break;case 3:Y=0X98;break;}WriteCommandLCD( Y+X , 1); //这里不检测忙信号,发送地址码X = X*2;Y = 0;while ( DData[Y] != 0 ) //若到达字符串尾则退出{if (X <= 0x0F) //X坐标应小于0xF{WriteDataLCD(DData[Y]);X++;Y++;//Delay5Ms();}else break;}}/****************************************************38KHz红外接收头部分(IR.h)东芝TC9012编码****************************************************/#include<reg52.h>#include<stdio.h>#include<intrins.h>#define TURE 1#define FALSE 0#define uchar unsigned char#define uint unsigned intsbit IR=P3^2; //红外接口,使用外部中断0unsigned char irtime;//红外用全局变量bit irok,irpro_ok;//红外接收成功标志,红外处理完毕标志unsigned char IRcord[4];32位数据码,共4个字节unsigned char irdata[33];//每个电平的持续时间void Ir_work(void);void Ircordpro(void);void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数{irtime++; //用于计数2个下降沿之间的时间}void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数{static unsigned char i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}void TIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1; //开中断TR0=1;}void EX0init(void){IT0 = 1; //外部中断0下降沿触发EX0 = 1; //使能外部中断EA = 1; //开总中断}void Ircordpro(void)//红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于7值为1,和晶振有关系,12M{value=value|0x80;}else{value=value;}if(j<8){value=value>>1;}k++;}IRcord[i]=value;value=0;} irpro_ok=1;//处理完毕标志位置1}void Port_init()//端口初始化{P0=0xff;P1=0xff;P2=0xff;P3=0xff;}/***********************************************AD9850部分(AD9850.h)时钟源为12M有源晶振***********************************************/#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define Data__A P0//数据口,并行模式#define Data__B P1sbit WCLK_A= P3^0;//控制字装载时钟sbit FQUD_A= P3^1;//频率更新sbit REST_A= P3^3;//复位sbit WCLK_B= P3^4;sbit FQUD_B= P3^5;sbit REST_B= P3^6;/********************************AD9850的40位控制字(5字节)第一字节:高5位为相位控制字,低三位为电源和其他控制字,低3位一般取000********************************/uchar word_a[5]={0x00,0x00,0x00,0x00,0x00};uchar word_b[5]={0x00,0x00,0x00,0x00,0x00};void CHF_A(unsigned long int a)//将想要的频率和相位转为40位控制字{unsigned long int j;j=357.9139413*a; //a是A通道要输出的频率值,单位Hz,12M除以2的32次方等于357.9139413word_a[1]=j>>24;word_a[2]=j>>16;word_a[3]=j>>8;word_a[4]=j;}void CHF_B(unsigned long int b){unsigned long int k;k=357.9139413*b; //b是B通道要输出的频率值,单位Hzword_b[1]=k>>24;word_b[2]=k>>16;word_b[3]=k>>8;word_b[4]=k;}void delay_1ms(uint t){uint i,j;for(i=0;i<t;i++)for(j=0;j<120;j++);}void Reset_AD9850()//复位,并行模式{WCLK_A=0;WCLK_B=0;FQUD_A=0;FQUD_B=0;REST_A=0;REST_B=0;REST_A=1;REST_B=1;REST_A=0;REST_B=0;}//以并行方式同时向两个AD9850写控制字void Write_AD9850(uchar PH_A,uchar PH_B,unsigned long int FQ_A,unsigned long int FQ_B) {uint i;REST_A=1;REST_B=1;delay_1ms(100);WCLK_A=0;WCLK_B=0;FQUD_A=0;FQUD_B=0;REST_A=1;REST_B=1;CHF_A(FQ_A);CHF_B(FQ_B);word_a[0]=PH_A;word_b[0]=PH_B;for(i=0;i<5;i++){Data__A=word_a[i];Data__B=word_b[i];WCLK_A=1;_nop_();WCLK_B=1;_nop_();WCLK_A=0;_nop_();WCLK_B=0;_nop_();}FQUD_A=0;_nop_();FQUD_B=0;_nop_();FQUD_A=1;_nop_();FQUD_B=1;_nop_();Data__A=0x00;Data__B=0x00;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子科技大学吴鉴鹰#include <c8051f020.h> // SFR declarations#include <intrins.h>#include <stdio.h>#include<math.h>#define uchar unsigned char#define uint unsigned intuchar i,j,colour=1,T=0;#define Lcd_Bus P5/*char code seg[360] = {0x80,0x82,0x84,0x86,0x88,0x8b,0x8d,0x8f,0x91,0x94, 0x96,0x98,0x9a,0x9c,0x9e,0xa1,0xa3,0xa5,0xa7,0xa9, 0xab,0xad,0xaf,0xb1,0xb4,0xb6,0xb8,0xba,0xbc,0xbe, 0xbf,0xc1,0xc3,0xc5,0xc7,0xc9,0xcb,0xcc,0xce,0xd0, 0xd2,0xd3,0xd5,0xd7,0xd8,0xda,0xdc,0xdd,0xdf,0xe0, 0xe2,0xe3,0xe4,0xe6,0xe7,0xe8,0xea,0xeb,0xec,0xed, 0xee,0xef,0xf0,0xf2,0xf3,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xf9,0xfa,0xfb,0xfb,0xfc,0xfc,0xfd,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xfd,0xfd,0xfc,0xfc,0xfb,0xfb,0xfa,0xf9,0xf9,/*0xf8,0xf7,0xf6,0xf5,0xf4,0xf4,0xf3,0xf2,0xf1,0xf0, 0xee,0xed,0xec,0xeb,0xea,0xe8,0xe7,0xe6,0xe4,0xe3, 0xe2,0xe0,0xdf,0xdd,0xdc,0xda,0xd9,0xd7,0xd5,0xd4, 0xd2,0xd0,0xce,0xcd,0xcb,0xc9,0xc7,0xc5,0xc3,0xc2, 0xc0,0xbe,0xbc,0xba,0xb8,0xb6,0xb4,0xb2,0xb0,0xae, 0xab,0xa9,0xa7,0xa5,0xa3,0xa1,0x9f,0x9c,0x9a,0x98, 0x96,0x94,0x92,0x8f,0x8d,0x8b,0x89,0x86,0x84,0x82, 0x80,0x7d,0x7b,0x79,0x77,0x75,0x72,0x70,0x6e,0x6c, 0x69,0x67,0x65,0x63,0x61,0x5f,0x5c,0x5a,0x58,0x56, 0x54,0x52,0x50,0x4e,0x4c,0x4a,0x48,0x46,0x44,0x42, 0x40,0x3e,0x3c,0x3a,0x38,0x36,0x34,0x33,0x31,0x2f, 0x2d,0x2c,0x2a,0x28,0x27,0x25,0x24,0x22,0x21,0x1f, 0x1e,0x1c,0x1b,0x19,0x18,0x17,0x16,0x14,0x13,0x12, 0x11,0x10,0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8,0x7, 0x7, 0x6, 0x5, 0x5, 0x4, 0x3, 0x3, 0x2, 0x2,0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1,0x1, 0x2, 0x2, 0x3, 0x3, 0x4, 0x4, 0x5, 0x6, 0x6,0x7, 0x8, 0x9, 0xa, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,0x10,0x12,0x13,0x14,0x15,0x16,0x18,0x19,0x1a,0x1c, 0x1d,0x1f,0x20,0x22,0x23,0x25,0x26,0x28,0x2a,0x2b, 0x2d,0x2f,0x30,0x32,0x34,0x36,0x38,0x39,0x3b,0x3d, 0x3f,0x41,0x43,0x45,0x47,0x49,0x4b,0x4d,0x4f,0x51,0x53,0x55,0x58,0x5a,0x5c,0x5e,0x60,0x62,0x65,0x67,0x69,0x6b,0x6d,0x70,0x72,0x74,0x76,0x78,0x7b,0x7d};*/#define SYSCLK 22118400 // SYSCLK frequency in Hz #define INT_DEC 256 // integrate and decimate ratio #define _Nop() _nop_()//#define FIRST_ADDR 0//-----------------------------------------------------------------------------// 16-bit SFR Definitions for 'F02x//-----------------------------------------------------------------------------sfr16 DP = 0x82; // data pointersfr16 TMR3RL = 0x92; // Timer3 reload valuesfr16 TMR3 = 0x94; // Timer3 countersfr16 ADC0 = 0xbe; // ADC0 datasfr16 ADC0GT = 0xc4; // ADC0 greater than window sfr16 ADC0LT = 0xc6; // ADC0 less than windowsfr16 RCAP2 = 0xca; // Timer2 capture/reloadsfr16 T2 = 0xcc; // Timer2sfr16 RCAP4 = 0xe4; // Timer4 capture/reloadsfr16 T4 = 0xf4; // Timer4sfr16 DAC0 = 0xd2; // DAC0 datasfr16 DAC1 = 0xd5; // DAC1 data//-----------------------------------------------------------------------------// 液晶接口定义//-----------------------------------------------------------------------------//#define LEDCTL0Low P4&=~0x01;//#define LEDCTL0High P4|=0x01;#define LCDELow P4&=~0x02;#define LCDEHigh P4|=0x02;#define LCDRWLow P4&=~0x04;#define LCDRWHigh P4|=0x04;#define LCDRSLow P4&=~0x08;#define LCDRSHigh P4|=0x08;#define LCDPSBLow P4&=~0x10;#define LCDPSBHigh P4|=0x10;//==============================//uchar num;uint delay_time;/*-----------------------------------------------------*/void SYSCLK_Init (void);void PORT_Init (void);//----------------------------------------------------------------------------- ////-----------------------------------------------------------------------------void delay(unsigned int t){ unsigned int k,j;for(k=0;k<t;k++)for(j=0;j<10;j++) ;}/*void delay(unsigned int t){unsigned int i,j ;for(i=0;i<t;i++)for(j=0;j<10;j++);}*///----------------------------------------------------------------------------- ////-----------------------------------------------------------------------------void delay18(uint k){ while(k){ k--; }}//----------------------------------------------------------------------------- // 液晶显示写命令//----------------------------------------------------------------------------- void write_com(unsigned char cmdcode){LCDRSLow;LCDRWLow;LCDEHigh;Lcd_Bus=cmdcode;delay(50);delay(60); //在数据写入的时候加入适当的延时LCDELow;delay(50);delay(60);}//-----------------------------------------------------------------------------// 液晶显示写数据//-----------------------------------------------------------------------------void write_data(unsigned char Dispdata){LCDRSHigh;LCDRWLow;LCDEHigh;Lcd_Bus=Dispdata;delay(50);delay(60); // 在数据写入的时候加入适当的延时LCDELow;delay(50);delay(60);}void chk_busy(){LCDRSLow;LCDRWHigh;LCDEHigh;Lcd_Bus=0xff ;while((Lcd_Bus&0x80)==0x80);LCDELow;}/*------------------写命令到LCD------------------------------*//*void write_com(unsigned char cmdcode){chk_busy();LCDRSLow ;LCDRWLow ;LCDEHigh ;Lcd_Bus=cmdcode ;delay(5);//------------------在数据写入的时候加入适当的延时LCDELow ;delay(5);}*//*-------------------写数据到LCD----------------------------*//*void write_data(unsigned char Dispdata){chk_busy();LCDRSHigh ;LCDRWLow ;LCDEHigh ;Lcd_Bus=Dispdata ;delay(5);//------------------在数据写入的时候加入适当的延时LCDELow ;delay(5);}*///-----------------------------------------------------------------------------// 液晶显示,复位初始//-----------------------------------------------------------------------------void lcdreset(){delay(200);delay(250);write_com(0x30);delay(100);delay(250); //选择基本指令集write_com(0x30); //选择8bit数据流delay(50);delay(250);write_com(0x0c); //开显示(无游标、不反白)delay(50);delay(250);write_com(0x01); //清除显示,并且设定地址指针为00Hdelay(50);delay(250);write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位}//-----------------------------------------------------------------------------// 液晶显示//-----------------------------------------------------------------------------/*void display(unsigned char code *s){while(*s>0){ write_data(*s);s++;delay(50);delay(100);}}*/void hzkdis(unsigned char code*s){while(*s>0){write_data(*s);s++;delay(50);}}/*------------------首屏显示--------------------------*///-----------------------------------------------------------------------------// 液晶显示内容//-----------------------------------------------------------------------------/*void zero_screen(){write_com(0x01);delay18(10000);//write_com(0x80);//display("电子科技大学");write_com(0x90);//display("省单片机精品课程");display("C8051F020 开发板");write_com(0x88);//display("C8051F020 开发板");display(" QQ:1811728618 ");//write_com(0x98);//display(" QQ:1811728618 ");}*//*------------------显示字符串--------------------------*/void ceshi(){write_com(0x01);//清除显示,并且设定地址指针为00Hdelay(5);write_com(0x80);//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)hzkdis("电子科技大学");write_com(0x90);//第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)hzkdis("通信与信息工程");write_com(0x88);//第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)hzkdis("电子信息工程");write_com(0x98);//第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)hzkdis("郑海波测试程序");}/*------------------初始化LCD屏--------------------------*//*void lcdreset(){LCDPSBHigh;delay(2000);write_com(0x30);delay(10);//选择基本指令集write_com(0x30);//选择8bit数据流delay(5);write_com(0x0c);//开显示(无游标、不反白)delay(10);write_com(0x01);//清除显示,并且设定地址指针为00Hdelay(500);write_com(0x06);//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位delay(0);}*///-----------------------------------------------------------------------------// 通用I/O口及交叉开关初始化//-----------------------------------------------------------------------------void PORT_Init (void){XBR2 = 0x40; // 交叉开关使能P74OUT=0xff;}//-----------------------------------------------------------------------------// 系统时钟初始化//-----------------------------------------------------------------------------/*void SYSCLK_Init() 本来就不用的{OSCICN =0x87; //使用内部时钟16Mwhile((OSCICN & 0x10)==0);//内部时钟按设定频率运行}*/// 配置系统时钟使用外部晶振11.0592MHzvoid SYSCLK_Init (void){int i; // delay counterOSCXCN = 0x67; // start external oscillator with// 22.1184MHz crystal for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settleOSCICN = 0x88; // select external oscillator as SYSCLK// source and enable missing clock// detector}//-----------------------------------------------------------------------------// 系统初始化//-----------------------------------------------------------------------------void init(){SYSCLK_Init();PORT_Init ();lcdreset();//zero_screen();}//-----------------------------------------------------------------------------// 主程序//-----------------------------------------------------------------------------/*void main(){WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器LCDPSBHigh;//LCDRSTHigh;init();zero_screen();P5=0xff;while(1){}} *///------------定义接口-------------///*sbit RS=P2^2 ;sbit RW=P2^3 ;sbit E=P2^4;sbit PSB= P2^5; //H=并口; L="串口";#define Lcd_Bus P0// P0 接LCM#define uchar unsigned char*///定义字符/汉字显示起始位置/*------------------检查忙位-----------------------------*//*------------------延时子程序-----------------------------*///------------------清整个GDRAM空间---------------------------- void clrgdram(){unsigned char x,y ;for(y=0;y<64;y++)for(x=0;x<16;x++){write_com(0x34);write_com(y+0x80);//行地址write_com(x+0x80);//列地址write_com(0x30);write_data(0x00);write_data(0x00);}}//------------------------------------------------------------void clrscreen(){write_com(0x01);delay(10);}unsigned char ReadByte(void){unsigned char byReturnValue ;chk_busy();Lcd_Bus=0xff ;LCDRSHigh ;LCDRWHigh ;LCDELow ;LCDEHigh;byReturnValue=Lcd_Bus ;LCDELow ;return byReturnValue ;}/*增加画点子程序函数功能:在坐标为(x,y)点画一个点参数意义X:12864屏幕的横坐标,范围是0到128(从左到右)Y:12864的纵坐标,范围是0到64(从上到下)Color:为1的时候表示为黑点*//*void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color) {unsigned char Row,Tier,Tier_bit ;unsigned char ReadOldH,ReadOldL ;write_com(0x34);write_com(0x36);Tier=X>>4 ;Tier_bit=X&0x0f ;if(Y<32){Row=Y ;}{Row=Y-32 ;Tier+=8 ;}write_com(Row+0x80);write_com(Tier+0x80);ReadByte();ReadOldH=ReadByte();ReadOldL=ReadByte();write_com(Row+0x80);write_com(Tier+0x80);if(Tier_bit<8){switch(Color){case 0 :ReadOldH&=(~(0x01<<(7-Tier_bit))); break ;case 1 :ReadOldH|=((0x01<<(7-Tier_bit))); break ;case 2 :ReadOldH^=(0x01<<(7-Tier_bit)); break ;default :break ;}write_data(ReadOldH);write_data(ReadOldL);}else{switch(Color){case 0 :ReadOldL&=(~(0x01<<(15-Tier_bit))); break ;case 1 :ReadOldL|=((0x01<<(15-Tier_bit))); break ;case 2 :ReadOldL^=(0x01<<(15-Tier_bit)); break ;break ;}write_data(ReadOldH);write_data(ReadOldL);}write_com(0x30);}void main(void){//WDTCN = 0xde; // 关闭WDT//WDTCN = 0xad;SYSCLK_Init ();PORT_Init ();//LCDRWLow;//lcdreset();//zero_screen();//clrgdram();delay(2000);clrscreen();while(1){for(i=0;i<128;i++){/*unsigned char k;if(j>0x32) k=seg[i];else k=-seg[i];j=0x32-k;*//*j=sin(i);DrawPoint(i,j,colour);}//T+=4;delay(5000);}while(1);}*/void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color) {unsigned char Row,Tier,Tier_bit ;unsigned char ReadOldH,ReadOldL ;write_com(0x34);write_com(0x36);Tier=X>>4 ;Tier_bit=X&0x0f ;{Row=Y ;}else{Row=Y-32 ;Tier+=8 ;}write_com(Row+0x80);write_com(Tier+0x80);ReadByte();ReadOldH=ReadByte();ReadOldL=ReadByte();write_com(Row+0x80);write_com(Tier+0x80);if(Tier_bit<8){switch(Color){case 0 :ReadOldH&=(~(0x01<<(7-Tier_bit))); break ;case 1 :ReadOldH|=(0x01<<(7-Tier_bit)); break ;case 2 :ReadOldH^=(0x01<<(7-Tier_bit)); break ;default :break ;}write_data(ReadOldH);write_data(ReadOldL);}else{switch(Color){case 0 :ReadOldL&=(~(0x01<<(15-Tier_bit))); break ;case 1 :ReadOldL|=(0x01<<(15-Tier_bit));case 2 :ReadOldL^=(0x01<<(15-Tier_bit)); break ;default :break ;}write_data(ReadOldH);write_data(ReadOldL);}write_com(0x30);}void main(void){uchar i,j,colour=1,T=0; LCDRWLow ;lcdreset();ceshi();clrgdram();delay(2000);clrscreen();while(1){for(i=0;i<128;i++){j=32-32*sin(2*i*3.14/(64+T)); DrawPoint(i,j,colour);}//T+=4;delay(5000);}while(1);}。