久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13408|回復: 10
收起左側

51單片機驅動PS2搖桿模塊用1602顯示X軸Y軸Y以及Z軸。1602用6線驅動

  [復制鏈接]
ID:79544 發表于 2016-10-12 15:12 | 顯示全部樓層 |閱讀模式
51單片機驅動PS2搖桿1602顯示程序(1602用6根線驅動
  1. /********************************************************
  2.         功   能:51單片機通過PS2搖桿模塊驅動4個LED
  3.                                 并用1602顯示
  4.                         (1602使用6根線驅動)
  5.         單片機:STC12C2052AD
  6.         晶   振:12M
  7.         注   釋:搖桿的x軸接單片機P10.搖桿的Y軸接單片機P11.
  8.                         Z軸接P17
  9.         作  者:蘇義江改編自網絡
  10.         時  間:2016-10-12
  11. *******************************************************/

  12. #include<stc12c2052ad.h>
  13. #include<intrins.h>

  14. #define uchar unsigned char
  15. #define uint unsigned int

  16. //#define TINER_HIGH  0XFF//24M
  17. //#define TINE_LOW    0XD8

  18. #define TINER_HIGH  0XFf//12M 100us
  19. #define TINE_LOW    0X9c

  20. #define    ADC_POWER   0x80  //定義ADC電源常量
  21. #define    ADC_FLAG    0x10  //定義ADC轉換結束標志位
  22. #define    ADC_START   0x08  //定義ADC轉換開始控制位

  23. #define    ADC_SPEEDLL 0x00  //1080個時鐘轉換一次
  24. #define    ADC_SPEEDL  0x20  //810個時鐘轉換一次
  25. #define    ADC_SPEEDH  0x40  //540個時鐘轉換一次
  26. #define    ADC_SPEEDHH 0x60  //270個時鐘轉換一次

  27. sbit led_red   =P1^6;
  28. sbit led_green =P1^5;
  29. sbit led_blue  =P1^4;
  30. sbit led_yellow=P1^3;
  31. sbit z_zhou    =P1^7;//Z軸

  32. uchar red=0x00,green=0x00,blue=0x00,yellow=0x00;
  33. uchar counter=0;

  34. typedef struct
  35. {
  36.         char x;
  37.         char y;
  38.         char drift;
  39. }pos;
  40. pos rocker;

  41. void delay(uint t)
  42. {
  43.         uint y,i;               //定義變量       
  44.         for(y=t;t>0;t--)             //如果t大于0,t減1(外層循環)
  45.         for(i=600;i>0;i--);         //i等于600,如果i大于0,i減1
  46. }

  47. ////////STC12C5608AD轉換定義在哪個IO口進行并轉換//////////////
  48. uchar Read5608AD (uchar CHA)
  49. {
  50.     uchar AD_FIN=0; //存儲A/D轉換標志;若在函數外定義此變量則不能得到連續變化的模擬量的顯示
  51. /////////以下為ADC初始化程序////////////
  52.     CHA &= 0x03;      
  53. //選擇ADC的8個接口中的一個(0000 0011 清0高6位)
  54.     ADC_CONTR = ADC_SPEEDHH;  //ADC轉換的速度(0XX0 0000 其中XX控制速度,請根據數據手冊設置)
  55.     _nop_();
  56.     ADC_CONTR |= CHA;       //選擇A/D當前通道
  57.     _nop_();
  58.     ADC_CONTR |= ADC_POWER;      //啟動A/D電源(1000 0000)
  59.     delay(1);            //使輸入電壓達到穩定(1ms即可?
  60. /////以下為ADC執行程序///////////////////
  61.     ADC_CONTR |= ADC_START;      //啟動A/D轉換(0000 1000 令ADCS = 1)
  62.     _nop_();
  63.     _nop_();
  64.     _nop_();
  65.     _nop_();
  66.     while (AD_FIN ==0)         //等待A/D轉換結束
  67.     {     
  68.     AD_FIN = (ADC_CONTR & ADC_FLAG); //0001 0000測試A/D轉換結束否
  69.     }
  70.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 關閉A/D轉換,
  71.     return (ADC_DATA);          //返回A/D轉換結果(8位)
  72. }
  73. /*
  74. ///////////STC12C2052AD轉換//////////////
  75. uchar Read2052AD (uchar CHA)
  76. {

  77.         uchar AD_FIN=0; //存儲A/D轉換標志;若在函數外定義此變量則不能得到連續變化的模擬量的顯示
  78. //////以下為ADC初始化程序/////////////////

  79.     CHA &= 0x07;            //選擇ADC的8個接口中的一個(0000 0111 清0高5位)
  80.     ADC_CONTR = 0x60;  //ADC轉換的速度(0XX0 0000 其中XX控制速度,請根據數據手冊設置)
  81.    _nop_();_nop_();_nop_();
  82.     ADC_CONTR |= CHA;       //選擇A/D當前通道
  83.     _nop_();_nop_();_nop_();
  84.     ADC_CONTR |= 0x80;      //啟動A/D電源
  85.     delay(2);            //使輸入電壓達到穩定(1ms即可?
  86. //////////以下為ADC執行程序////////////////////
  87.     ADC_CONTR |= 0x08;      //啟動A/D轉換(0000 1000 令ADCS = 1)
  88.     _nop_();
  89.     _nop_();
  90.     _nop_();
  91.     _nop_();
  92.         _nop_();
  93.         _nop_();
  94.     while (AD_FIN ==0)
  95.         {     //等待A/D轉換結束
  96.             AD_FIN = (ADC_CONTR & 0x10); //0001 0000測試A/D轉換結束否
  97.     }
  98.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 關閉A/D轉換,
  99.         return (ADC_DATA);          //返回A/D轉換結果(8位)
  100. }
  101. */
  102. pos rocker_read(int drift)
  103. {
  104.         pos buffer;
  105.         buffer.x=128-Read5608AD (1);
  106.         buffer.y=128-Read5608AD (0);
  107.         buffer.drift=drift;
  108.         return (buffer);
  109. }
  110. void timer0_init()
  111. {
  112.         TMOD=0X01;
  113.         TH0=TINER_HIGH ;
  114.         TL0=TINE_LOW;
  115.         ET0=1;
  116.         TR0=1;
  117.         EA=1;
  118. }
  119. void timer0_irpt() interrupt 1
  120. {
  121.         TH0=TINER_HIGH ;
  122.         TL0=TINE_LOW;
  123.         counter++;
  124.         if(counter<red)    led_red=0;    else led_red=1;               
  125.         if(counter<green)  led_green=0;  else led_green=1;
  126.         if(counter<blue)   led_blue=0;   else led_blue=1;
  127.         if(counter<yellow) led_yellow=0; else led_yellow=1;
  128. }
  129. //6根線驅動LCD1602接口定義              
  130. #define LCD_DB P2 // - - P2 = DB4~DB7
  131. sbit LCD_RS=P2^2; // - - p2.2 = RS
  132. //sbit LCD_RW=P0^6; // - - p2.1 = RW 接地
  133. sbit LCD_E=P2^3; // - - p2.3 = E

  134. // - - 定義子程序函數
  135. void LCD_init(void); // - - 初始化LCD1602函數
  136. void LCD_write_H4bit_command(uchar dat);
  137. void LCD_write_L4bit_command(uchar dat);
  138. void LCD_write_4bit_command(uchar command); // - - 向LCD1602寫指令函數
  139. void LCD_write_4bit_data(uchar dat); // - - 向LCD1602寫數據函數
  140. void LCD_set_xy(uchar x,uchar y); // - - 設置LCD1602顯示位置 X(0-16),y(1-2)
  141. void LCD_disp_char(uchar x,uchar y,uchar dat); // - - 在LCD1602上顯示一個字符
  142. void LCD_disp_string(uchar X,uchar Y,uchar *s); // - - 在LCD1602上顯示一個字符串
  143. //void LCD_check_busy(void);//檢查忙函數。我沒用到此函數,因為通過率極低。
  144. void LCD_delay_10us(uint n); // - - 10微秒的延時子程序
  145. void LCD_delay_50us(uint n); // - - 50微秒的延時子程序
  146. void LCD_delay_10us(uint n) // - - 10微秒的延時子程序
  147. {
  148. uint i,j;
  149. for(i=n*10;i>0;i--) // - - 晶振及單片機修改設置
  150. for(j=2;j>0;j--);
  151. }

  152. void LCD_delay_50us(uint n) // - - 50微秒的延時子程序
  153. {
  154.         uint i,j;
  155.         for(i=n*10;i>0;i--) // - - 晶振及單片機修改設置
  156.         for(j=22;j>0;j--);
  157. }
  158. // - - 初始化LCD1602
  159. void LCD_init(void)
  160. {
  161.         LCD_delay_50us(50);
  162.         LCD_RS=0; // - - 指令
  163. //        LCD_RW=0; // - - 寫入
  164.         LCD_E=0; // - - 使能
  165.         LCD_write_L4bit_command(0x03); // - - 設置4位格式,2行,5x7
  166.         LCD_delay_50us(20);       
  167.         LCD_write_L4bit_command(0x03); // - - 設置4位格式,2行,5x7
  168.         LCD_delay_50us(20);
  169.         LCD_write_L4bit_command(0x02); // - - 設置4位格式,2行,5x7
  170.         LCD_delay_50us(2);
  171.         LCD_write_4bit_command(0x28); // - - 設置4位格式,2行,5x7
  172.         LCD_delay_10us(10);
  173.         LCD_write_4bit_command(0x28); // - - 設置4位格式,2行,5x7
  174.         LCD_delay_10us(10);
  175.         LCD_write_4bit_command(0x0c); // - - 整體顯示,關光標,不閃爍
  176.         LCD_delay_10us(10);
  177.         LCD_write_4bit_command(0x06); // - - 設定輸入方式,增量不移位
  178.         LCD_delay_10us(10);
  179.         LCD_write_4bit_command(0x01); // - - 清除屏幕顯示
  180.         LCD_delay_50us(40);
  181. }
  182. //********************************

  183. // - - 向LCD1602寫指令
  184. void LCD_write_4bit_command(uchar dat)
  185. {
  186.         LCD_delay_10us(50);
  187.         LCD_RS=0; // - - 指令
  188. //        LCD_RW=0; // - - 寫入
  189.         LCD_write_H4bit_command(dat);
  190.         LCD_write_L4bit_command(dat);
  191. }

  192. // - - 向LCD1602寫高四位指令
  193. void LCD_write_H4bit_command(uchar dat)
  194. {
  195.         LCD_delay_10us(250);
  196.         LCD_DB=(LCD_DB&0x0F)|(dat&0xF0);
  197.         LCD_delay_10us(50);
  198.         LCD_E=1; // - - 允許
  199.         LCD_delay_10us(250);
  200.         LCD_E=0;
  201. }

  202. // - - 向LCD1602寫低四位指令
  203. void LCD_write_L4bit_command(uchar dat)
  204. {
  205.         dat<<=4;
  206.         LCD_delay_10us(50);
  207.         LCD_DB=(LCD_DB&0x0F)|(dat&0xF0);
  208.         LCD_delay_10us(50);
  209.         LCD_E=1; // - - 允許
  210.         LCD_delay_10us(250);
  211.         LCD_E=0;
  212. }

  213. // - - 向LCD1602寫數據
  214. void LCD_write_4bit_data(uchar dat)
  215. {
  216.         LCD_delay_10us(50);
  217.         LCD_RS=1; // - - 數據
  218. //        LCD_RW=0; // - - 寫入
  219.         LCD_write_H4bit_command(dat);
  220.         LCD_write_L4bit_command(dat);
  221. }

  222. // - - 設置顯示位置
  223. void LCD_set_xy(uchar x,uchar y)
  224. {
  225.         uchar address;
  226.         if(y==1)
  227.         {
  228.                 address=0x80+x; // - - 第一行位置
  229.         }
  230.         else
  231.         {
  232.                 address=0xc0+x; // - - 第二行位置
  233.         }
  234.         LCD_delay_10us(50);
  235.         LCD_write_4bit_command(address);
  236. }

  237. // - - 顯示一個字符函數
  238. void LCD_disp_char(uchar x,uchar y,uchar dat)
  239. // - - LCD_disp_char(0,1,0x38); // - - 顯示8
  240. {
  241.         LCD_set_xy(x,y);
  242.         LCD_delay_10us(5);
  243.         LCD_write_4bit_data(dat);
  244. }

  245. // - - 顯示一個字符串函數
  246. void LCD_disp_string(uchar x,uchar y,uchar *s)
  247. {
  248.         LCD_set_xy(x,y);
  249.         LCD_delay_10us(5);
  250.         while(*s!='\0')
  251.         {
  252.                 LCD_write_4bit_data(*s);
  253.                 s++;
  254.         }
  255. }
  256. void display(uint num )//顯示數字
  257. {
  258.         uchar qian,bai,shi,ge;
  259.         qian=num/1000;
  260.         bai=num%1000/100;
  261.         shi=num%100/10;
  262.         ge=num%10;
  263.         LCD_set_xy(3,0);
  264.         LCD_write_4bit_data(qian+0x30);
  265.         LCD_write_4bit_data(bai+0x30);
  266.         LCD_write_4bit_data(shi+0x30);
  267.         LCD_write_4bit_data(ge+0x30);
  268. }
  269. void display1(uint num )//顯示數字
  270. {
  271.         uchar qian,bai,shi,ge;
  272.         qian=num/1000;
  273.         bai=num%1000/100;
  274.         shi=num%100/10;
  275.         ge=num%10;
  276.         LCD_set_xy(11,0);
  277.         LCD_write_4bit_data(qian+0x30);
  278.         LCD_write_4bit_data(bai+0x30);
  279.         LCD_write_4bit_data(shi+0x30);
  280.         LCD_write_4bit_data(ge+0x30);
  281. }
  282. void main()
  283. {
  284.         LCD_init();
  285.         timer0_init();
  286.         LCD_disp_string(0,0,"X=");
  287.         LCD_disp_string(8,0,"Y=");
  288.         LCD_disp_string(4,1,"Z=");
  289.         while(1)
  290.         {
  291.                 if(z_zhou==0)
  292.                 {
  293.                         LCD_disp_string(7,1,"O N");
  294.                 }
  295.                
  296.                 else
  297.                 {
  298.         //        LCD_write_4bit_command(0x01);
  299.                 LCD_disp_string(7,1,"OFF");
  300.                 }
  301.                 rocker=rocker_read(0);               
  302.                 if(rocker.x<-3)
  303.                 {
  304.                         rocker.x=-rocker.x+1;
  305.                         blue=rocker.x<<1;
  306.                         display(blue);
  307.                 }
  308.                 else
  309.                 {
  310.                         if(rocker.x>3)
  311.                         {
  312.                                 green=rocker.x<<1;
  313.                                 display(green);
  314.                         }
  315.                         else
  316.                         {
  317.                                 green=blue=0;
  318.                         }
  319.                 }
  320.                 if(rocker.y<-3)
  321.                 {
  322.                         rocker.y=-rocker.y+1;
  323.                         yellow=rocker.y<<1;
  324.                         display1(yellow);
  325.                 }
  326.                 else
  327.                 {
  328.                         if(rocker.y>3)
  329.                         {
  330.                                 red=rocker.y<<1;
  331.                                 display1(red);
  332.                         }
  333.                         else
  334.                         {
  335.                                 yellow=red=0;
  336.                         }
  337.                 }
  338.         }
  339. }
復制代碼


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:140343 發表于 2016-10-12 15:26 | 顯示全部樓層
這個好,PS2搖桿也可以用于我們的單片機diy了,不知道樓主的ps2搖桿的型號是什么?所有的搖桿都可以用這個方法來驅動嗎?
回復

使用道具 舉報

ID:147475 發表于 2017-1-16 10:04 | 顯示全部樓層
大俠,請問我把程序用到我的板子上(80c51)怎么不行,是AD程序不一樣嗎?
回復

使用道具 舉報

ID:171735 發表于 2017-3-18 11:12 | 顯示全部樓層
木子喬 發表于 2017-1-16 10:04
大俠,請問我把程序用到我的板子上(80c51)怎么不行,是AD程序不一樣嗎?

這個程序的Ad是stc12單片機內部自帶的AD,80C51沒有內部AD,所以用不了。
回復

使用道具 舉報

ID:232956 發表于 2018-2-1 16:59 | 顯示全部樓層
請問可以用stc12c5a16s2代替嗎?  都是12系列的應該可以吧?
回復

使用道具 舉報

ID:286699 發表于 2018-3-7 13:22 | 顯示全部樓層
zeng10119 發表于 2017-3-18 11:12
這個程序的Ad是stc12單片機內部自帶的AD,80C51沒有內部AD,所以用不了。

樓主你好~這個x,y軸出來的是模擬量的電壓值嗎?  也就是在89c51上接一個PCF8591這樣一個A/D轉換模塊就好了吧
回復

使用道具 舉報

ID:242932 發表于 2018-8-5 14:00 | 顯示全部樓層
666666666
回復

使用道具 舉報

ID:383138 發表于 2018-8-5 16:16 | 顯示全部樓層
加個按鍵記錄和按鍵循環自動輸出會更實用
回復

使用道具 舉報

ID:380389 發表于 2018-8-6 06:40 來自手機 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

ID:492472 發表于 2019-7-16 21:41 | 顯示全部樓層
樓主還在嗎?
回復

使用道具 舉報

ID:155987 發表于 2020-4-22 16:55 | 顯示全部樓層
編譯下都是問題
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区二区 | 久久999| 成人黄页在线观看 | 少妇淫片aaaaa毛片叫床爽 | 欧美成人一区二区三区 | 欧美精品在线观看 | 男女久久久 | 麻豆一区 | 亚洲成人免费在线观看 | 国产精品成人在线 | 在线视频亚洲 | 国产1区在线 | 欧美激情视频一区二区三区免费 | 视频在线日韩 | 国产精品久久久久久久久图文区 | 日韩国产一区二区三区 | 日本天天色 | 金莲网 | av影音资源 | 国产精品久久久久久久久久免费看 | 成人网在线观看 | 国产精品一区二区av | 国产视频观看 | 99福利视频导航 | 成人激情视频免费在线观看 | 视频精品一区 | 国产国产精品久久久久 | 特黄一级 | 欧美a区 | 亚洲中国字幕 | 精品综合久久久 | 国产精品一区二区在线观看 | 日韩免费视频一区二区 | 精品欧美一区免费观看α√ | 欧美一级久久 | 欧美日韩免费视频 | 久久99国产精品 | 国产精品美女久久久久aⅴ国产馆 | 毛片网站在线观看视频 | 久久久婷婷 | 国产成人叼嘿视频在线观看 |