完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 pkintel 于 2016-7-13 22:41 编辑
电子琴电路:http://pan.baidu.com/s/1qXWMtdy 电子琴程序:http://pan.baidu.com/s/1jIxwVwa
|
|
相关推荐
8 个讨论
|
|
//程序: #include #include #define uchar unsigned char #define uint unsigned int ***it RS = P2^5; ***it RW = P2^6; ***it LCDEN = P2^7; ***it LCD_BUSY = P0^7; //lcd1602忙碌标志位 #define LCD_DATA P0 //P0口接LCD数据口 #define PKEY P1 //定义4x4按键接的IO口 行扫描 ***it PLAY = P3^7; ***it SPK = P2^0; #define ALLSONG 3 //歌曲总数 按实际写 #define CODEMAX 30 //最大音符数 uchar tone_h; uchar tone_l; uchar t1_flag = 0; //用于记录定时器1进入中断的次数 uchar PressTime = 0; //按键按下的时间(节拍) uchar code chuzhi[3][16]={ //音调对应的计数初值 0xff,0xff, //用任意值占0位,因为音调从1开始 0xf8,0x8c,//低1 0xf9,0x5b,// 2 0xfa,0x15,// 3 0xfa,0x67,// 4 0xfb,0x04,// 5 0xfb,0x90,// 6 0xfc,0x0c,//低7 0xff,0xff,//占0位 0xfc,0x44,//中1 0xfc,0xac,// 2 0xfd,0x09,// 3 0xfd,0x34,// 4 0xfd,0x82,// 5 0xfd,0xc8,// 6 0xfe,0x06,//中7 0xff,0xff,//占0位 0xfe,0x22,//高1 0xfe,0x56,// 2 0xfe,0x85,// 3 0xfe,0x9a,// 4 0xfe,0xc1,// 5 0xfe,0xe4,// 6 0xff,0x03 //高7 }; //===================== //=== LCD部分 //===================== //== 延时函数 ================== void lcd1602_delayms(uint ms)//延时?个 ms { uchar a,b,c; while(ms--) { for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } } //========================================== //忙碌检测 //========================================== void busy_check() { /* RW = 1; //读 RS = 0; //指令寄存器 LCD_DATA = 0xFF;//实验证明读数时要将I/O口要置1 LCDEN = 0; _nop_(); _nop_(); _nop_(); _nop_(); LCDEN = 1;// EN高电平读信息 负跳变执行指令 _nop_(); _nop_(); _nop_(); _nop_(); while(1) { if(LCD_BUSY == 0)//P07 == 0跳出循环 break; }*/ lcd1602_delayms(2);//采用延时法 } //================== //写指令 //================== void lcdwrcom(uchar command) { busy_check(); RW = 0;//写 RS = 0;//指令寄存器 LCD_DATA = command; LCDEN = 1;//负跳变写入指令 _nop_(); _nop_(); _nop_(); _nop_(); LCDEN = 0; } //========================================== //写数据 数字、字母、标点符号都是数据 //========================================== void lcdwrdata(uchar lcd_data) { busy_check(); RW = 0;//写 RS = 1;//数据寄存器 LCD_DATA = lcd_data; LCDEN = 1;//负跳变写入指令 _nop_(); _nop_(); _nop_(); _nop_(); LCDEN = 0; } //================= //lcd1602初始化 //================= void LCD_Init() { lcd1602_delayms(15);//必要 lcd1602上电到电压稳定需要时间 RW = 0;//写 RS = 0;//指令寄存器 LCD_DATA = 0x38;// 0x38设置显示模式为:16X2 显示,5X7 点阵,8 位数据接口' LCDEN = 1; _nop_(); _nop_(); _nop_(); _nop_(); LCDEN = 0; lcd1602_delayms(5); lcdwrcom(0x0c);//打开显示 无光标 不闪烁 lcdwrcom(0x06);//指令3 光标右移 屏幕所有文字移动无效 lcdwrcom(0x01);// 清显示,光标复位到地址00H位置。 } //========================================== //LCD扩展函数: //========================================== //========================================== //定位下一步要写数的地址 //========================================== void address(uchar hang,uchar lie) { uchar location; if(hang == 0) location = 0x80|lie; else location = 0xC0|lie; lcdwrcom(location); } //========================================== //显示字母、单个字符 //========================================== void printchar(uchar hang,uchar lie,uchar letter) { address(hang,lie); lcdwrdata(letter); } //========================================== //显示单词(字符数组) //========================================== void printword(uchar hang,uchar lie,uchar *word) { uchar i = 0; address(hang,lie); for(i = 0;word[i] != ' |